Могу ли я заменить SimpleRow на Image, если нет доступных данных модели? - PullRequest
0 голосов
/ 02 апреля 2019

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

Что я хочу сделать, это когда модель 'empty '(будучи неопределенным, что может произойти, когда ключ, который он ищет, еще не создан в моей базе данных 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 & 4 as the same
]

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

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

Любая помощь очень ценится!

1 Ответ

1 голос
/ 16 апреля 2019

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

    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)
            console.log(modelArr)
        }
        var modelObect = modelArr.find(
                    function(obj) {
                        return obj.status === "pending";
                    }
                    );

        if(modelObect === undefined)
            return emptyHol;

        return currentGroupList;
    }

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

Спасибо!

...