обработка вложенных данных JSON для ListView - PullRequest
0 голосов
/ 28 февраля 2019

Я ищу доступ к вложенным данным JSON из базы данных Firebase для использования в listView, это то, что я применил ко всему моему приложению, но теперь у меня возникают проблемы с доступом к дочерним элементам данных с динамическими свойствами.

Экспорт моих данных JSON из моей базы данных:

{
    "T&G Canary Wharf" : {
        "Administrator" : {
            "1550633367665" : {
                "date" : "2019-02-12T12:00:00.000",
                "details" : "Full Day",
                "name" : "Edward Lawrence",
                "status" : "pending"
            },
            "1550633370715" : {
                "date" : "2019-02-13T12:00:00.000",
                "details" : "Full Day",
                "name" : "Edward Lawrence",
                "status" : false
            },
            "1550845072137" : {
                "date" : "2019-02-12T12:00:00.000",
                "details" : "Full Day",
                "name" : "Katie Prescott ",
                "status" : 1
            },
        },
        "Stylist" : {
            "1551222170677" : {
            "date" : "2019-02-19T12:00:00.000",
            "details" : "Full Day",
            "name" : "Stylist Stylist",
            "status" : "pending"
      }
    }
  }
}

Для пользователя приложения group (в приведенном выше примере T & G Canary Wharf) всегда будет установлен, ноsubgroup (в примере «Администратор и стилисты») является динамическим для администраторов, и вот где я борюсь,

Мой код для моей базы данных Firebase приведен ниже:

Я используюfelgo (ранее v-play), ссылка на документацию по Firebase:

Плагин Felgo Firebase

App {

    property var adminModel: []
    property var groupName //the group name is assigned onLoggedIn, in this example group name === T&G Canary Wharf

    FirebaseDatabase {
        onLoggedIn: { 
        firebaseDb.getValue("groups" + "/" + groupName, {
                                orderByValue: true
                            }, function(success, key, value) {
                            if(success){
                            console.log("ADMIN MODEL: " + JSON.stringify(value))
                            adminModel = value // my array where I intend to push the data too                              
                            }
                        })
                    }
                }
            }

Я читаю;

доступ / обработка вложенных объектов, массивов или JSON

(кстати, очень полезно), в частности раздел Что делать, если имена свойств являются динамическими, а я не знаюих заранее?

Я могуn создать две записи списка, из Administrator и Stylist (подгруппы, но где дочерний ключ этого также является динамическим (время создания записи, например: "1550633367665"), я не могу продолжить?

для создания этой модели у меня есть код:

ListPage {
    id: adminPage

    model: Object.keys(adminModel)

delegate: SwipeOptionsContainer {
    id: container

    rightOption:  SwipeButton {
        anchors.fill: parent
        backgroundColor: "red"
        icon: IconType.trash

        onClicked: {
            container.hideOptions()
        }
    }

    SimpleRow {
        id: userRow
        width: parent.width
        text: modelData
        }
    }
}

У меня вопрос

Как я могу создать listView с делегатамиявляясь любым объектом, содержащим "status" : "pending" - выполняется в других областях с использованием цикла if (value[i].status === pending) { arr.push({...})}, но пока subgroup (Stylist/Administrator) неизвестен, из приведенного выше примера базы данных будет 2 элемента списка, но на самом деле он будет содержать гораздо большенесколько subGroup х

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

После выполнения getValue из FireBase кажется, что вам нужно выполнить несколько вещей:

  1. Получить подгруппы из вашей группы.
  2. Итерация по подгруппам.
  3. Для каждой подгруппы извлекайте записи времени.
  4. Фильтруйте записи времени по их статусу "pending".

Похоже, вы ужешаг 1 достигнут с Object.keys(adminModel).Теперь мы сделаем еще пару шагов с помощью цикла for (Шаг 2 √).

var subgroups = Object.keys(adminModel);
for (var i in subgroups) {
    var subgroup = adminModel[subgroups[i]];

    // ...
}

Для удобства мы определили subgroup_obj, в котором будут храниться данные подгруппы.Например,

"Stylist": {
      "1551222170677" : {
           "date" : "2019-02-19T12:00:00.000",
           "details" : "Full Day",
           "name" : "Stylist Stylist",
           "status" : "pending"
      }
}

Затем мы переходим к шагу 3, извлекая записи времени, снова используя Object.keys(), но на этот раз для подгруппы.

var timeEntries = Object.keys(subgroup);

, поскольку Object.keys() возвращает массив, мы можем выполнить Шаг 4, используя filter() метод массива для фильтрации записей с ожидающим статусом.

var filteredEntries = timeEntries.filter(function(t) { return subgroup[t].status === "pending"; } );

С более новой версией JS, вы можете сделать timeEntries.filter(t => subgroup[t].status === "pending") но, похоже, это еще не полностью поддерживается Qt.

И это все.filteredEntries дает нам массив записей времени (например, [ "1551222170677" ]) для каждой подгруппы.

Если вам нужен полный объект ввода времени, вы можете использовать map метод массива чтобы получить

var filteredEntries2 = filteredEntries.map(function(t) { return subgroup[t]; });

, который дает вам массив объектов.Так что-то вроде

[
{
    date: "2019-02-19T12:00:00.000"
    details: "Full Day"
    name: "Stylist Stylist"
    status: "pending"
}
]

Надеюсь, это поможет!

0 голосов
/ 28 февраля 2019

Когда вы получаете данные из базы данных Firebase, вы получаете обратно DataSnapshot, который содержит forEach метод, который вы можете использовать для циклического перебора всех дочерних узлов.

Таким образом, чтобы загрузить группу и показатьназвания всех предметов:

firebase.database().ref("group").once("value").then(function(snapshot) {
  snapshot.forEach(function(groupSnapshot) {
    groupSnapshot.forEach(function(subgroupSnapshot) {
      console.log(subgroupSnapshot.val().name);
    })
  })
})
...