Могу ли я заменить SimpleRow изображением, если недоступны модельные данные

#qt #listview #model #qml #v-play

#qt #listview #Модель #qml #v-play

Вопрос:

У меня есть ListView , где отображаемые в данный момент modelData изменения, когда кнопка переключается между несколькими параметрами отдела. Если в одном из этих отделов нет данных, my delegate продолжает показывать предыдущий список данных, пока не дойдет до нового раздела modelData с данными.

Что я хочу сделать, так это когда модель «пуста» (не определена, что может произойти, когда искомый ключ еще не создан в моей базе данных Firebase, или в данный момент элементы не видны), вместо этого отображается текст / изображение; т. е. «Двигайтесь дальше, здесь нечего видеть».

Моя модель взята из JSON, пример приведен ниже. и мой calendarUserItems является корневым узлом нескольких дочерних узлов в моей базе данных Firebase, моей целью AppButton.groupCycle было также добавить дополнительное направление к каждому дочернему узлу, фильтруя данные по этому для просмотра и редактирования на странице.

Пример моего кода:

 Page {
id: adminPage

property var departments: [1,2,3,4]
property int currGroupIndex: 0

    AppButton {
        id: groupCycle   
        text: "Viewing: "   departments[currGroupIndex]
        onClicked: {
            if (currGroupIndex == departments.length - 1)
                currGroupIndex = 0;
            else
                currGroupIndex  ;
        }
    }

    ListView {

        model: Object.keys(dataModel.calendarUserItems[departments[currGroupIndex]])

        delegate: modelData.visible ? currentGroupList : emptyHol

        Component {
            id: emptyHol
            AppText {
                text: "nothing to see here move along now!"
            }
        }
        Component {
            id: currentGroupList
            SimpleRow {
                id: container                

                readonly property var calendarUserItem: dataModel.calendarUserItems[departments[currGroupIndex]][modelData] || {}

                visible: container.calendarUserItem.status === "pending" ? true : false
                 // only pending items visible
                 // remaining code for simple row
            }
        }
    }
}
  

примером JSON в моем dataModel.calendarUserItems является:

 "groupName": [
    { "department1": 
        { "1555111624727" : {
              "creationDate" : 1555111624727,
              "date" : "2019-03-15T12:00:00.000",
              "name" : "Edward Lawrence",
              "status": "pending"
             },
//several of these entries within department1
        },
    },
    { "department2":
        { "1555111624727" : {
              "creationDate" : 1555111624456,
              "date" : "2019-05-1T12:00:00.000",
              "name" : "Katie P",
              "status": 1
             },
//several of these entries within department2
        },
    }
//departments 3 amp; 4 as the same
]
  

Если в отделах 2 и 3 есть modelData , а в 1 и 4 нет, я хочу, чтобы вместо этого отображался текст, а ListView пустой, вместо отображения предыдущего modelData .

Я пытался поиграть с видимостью изображения / текста, но проблема больше связана с очисткой modelData , и я не уверен, с чего начать?

Любая помощь приветствуется!

Комментарии:

1. как насчет delegate: someCondition ? Component1 : Component2 ?

2. Привет @folibis спасибо за указание, я пробовал такие вещи, как delegate: if(Object.keys(dataModel.calendarUserItems[departments[currGroupIndex]]).length > 0 или != {} , но получаю только ошибки в ? неожиданном токене bool ‘?’ чтобы проверить, не пусты ли данные модели, или в ней есть объекты в пределах используемой длины?

3. @folibis Я обдумывал ваше предложение с момента моего предыдущего комментария и все еще не могу добиться какого-либо прогресса — где my modelData , из массива, а некоторые элементы — нет visible , я не могу делать такие вещи, как model.count > 0 ? Component1 : Component2 , какие могут быть мои варианты, чтобы либо проверить, нет ли modelData вообще, либо нет ли visible элементов в SimpleRow делегате?

4. modelData не может быть пустым, поскольку движок принимает model как массив и применяет ссылку на каждый элемент как modelData на элемент делегирования. Что касается visible свойства, не могли бы вы использовать delegate: modelData.visible ? Component1 : Component2 ?

5. Привет @folibis Я думаю, что основная проблема, с которой я сталкиваюсь в настоящее время, связана с моим, readonly property var calendarUserItem: dataModel.calendarUserItems[departments[currGroupIndex]][modelData] || {} поскольку, когда у currGroupIndex нет данных, видимых или в базе данных, это приводит к ошибкам и не удаляет предыдущее currGroupIndex представление?

Ответ №1:

Я добился отображения, используя следующее в качестве своего делегата:

 delegate: {
  if (!(departments[currGroupIndex] in dataModel.calendarUserItems) ) {
    return emptyHol;
  }
  var subgroups = Object.keys(dataModel.calendarUserItems[departments[currGroupIndex]]);
  for (var i in subgroups) {
    var subgroup = dataModel.calendarUserItems[departments[currGroupIndex]][subgroups[i]];
    modelArr.push(subgroup);
  }
  var modelObect = modelArr.find( function(obj) { return obj.status === "pending"; } );
  
  if (modelObect === undefined) {
    return emptyHol;
  }            
  return currentGroupList;
}
  

Затем, когда мой AppButton.groupCycle нажат, я добавил modelArr = [] для очистки массива при каждом нажатии, это работает так, как задумано.

Спасибо!

Комментарии:

1. Я не совсем уверен в вашем последнем абзаце… что это за база данных? Так ли это dataModel.calendarUserItems ? Было ли конкретное сообщение об ошибке?

2. Привет @TrebledJ извиняюсь, я отредактировал и вопрос, и ответ! Надеюсь, теперь это для вас понятнее! Спасибо!