Плагин NativeScript/Typescript/Firebase получает и использует данные, когда singleEvent имеет значение true

Я использую плагин для NativeScript и Firebase (nativescript-plugin-firebase), чтобы кодировать серверную часть мобильного приложения, над которым я работаю. У меня есть сценарий, в котором я использую firebase.query, а затем использую его с SingleEvent, установленным в true (поэтому он не прослушивается постоянно).

Проблема, с которой я сталкиваюсь, заключается в попытке получить доступ к ключу одного или нескольких элементов, а также иметь возможность делать такие вещи, как item.name, item.id и т. д. Я могу получить эти данные, если использую "SingleEvent: false" параметр, но не когда для него установлено значение «SingleEvent: true». Я пытался делать сумасшедшие вещи, такие как JSON.stringify to JSON.parse, чтобы создать новый массив JS, но кажется, что я иду по неправильному пути, поскольку должен быть более простой способ (я надеюсь).

Обратный вызов (упрощено для SO):

var onQueryEvent = function (result) {
        // note that the query returns 1 match at a time
        // in the order specified in the query
        if (!result.error) {


            //FirebaseService.consoleFlowerBox("Result: " + JSON.stringify(result));
            var _items = JSON.stringify(result.value);
            var _itemsParse = JSON.parse("[" + _items + "]");
            var items = [];
            for (let rec of _itemsParse) {
                items.push(rec);
            }

            //
            // Use with Single Event Setting
            //
            var i = 0;
            for (let singleItem of items) {
                    // Get the object Key
                    var mykey = "";
                    for (let k in singleItem) {
                        mykey = k;
                    } 

                var _item = JSON.stringify(singleItem
}

Запрос:

firebase.query(
        onQueryEvent,
        "/" + this.c.nodeC.UPLOAD_ITEMS,
        {
            // true:  runs once, provides all data to onQueryEvent
            // false: loops onQueryEvent, row by row, continuous listening
            singleEvent: true,
            orderBy: {
                type: firebase.QueryOrderByType.CHILD,
                value: 'UID'
            },
            range: {
                type: firebase.QueryRangeType.EQUAL_TO,
                value: BackendService.token
            },


        }
    );

Результат:

[{"-KpGrapjgsM427sd9g7w":{"selected":true,"modifiedDate":"2017-07-17","UID":"cJiaR0jgR2RYUcsp6t7PgKac9ef2","description":"234","status":"Not Uploaded","modifiedByUID":"cJiaR0jgR2RYUcsp6t7PgKac9ef2","name":"Test 3","localFullPath":"/data/user/0/com.customapp.test/files/UploadedMedia/1500317102269.png","count":2,"archived":false,"modifiedTime":"4:18:21 pm"}}]

Когда у меня есть "данные" из singleEvent: true, я хотел бы иметь возможность сделать что-то вроде этого:

(if multiple records)
for (let item of items) {
   var x = item.id;
   var y = item.name;
}

(if single record)
var x = item.id;
var y = item.name;

Спасибо!


person piercove    schedule 17.07.2017    source источник


Ответы (1)


Из-за отсутствия документации, лучшего знания TypeScript или комбинации того и другого я понял, как получить набор результатов с помощью nativescript-plugin-firebase, firebase.query< /strong> и параметр singleEvent: true.

Хитрость заключается в использовании let из TypeScript.

// Loop through the results
for (let id in result.value) {...}

А затем получить объект на основе id из firebase.

// Get the object based on the id 
let res = (<any>Object).assign({ id: id }, result.value[id]);

Полный код функции:

    var that = this;
    var onQueryEvent = function (result) {
        // note that the query returns 1 match at a time
        // in the order specified in the query
        if (!result.error) {
            //
            // Use with singleEvent: true
            //

            // Loop through the result(s)
            for (let id in result.value) {
                // Get the object based on the id 
                let res = (<any>Object).assign({ id: id }, result.value[id]);

                if (res.selected && res.status != "Review") {

                    // Update Upload Record
                    var _newInfo = {
                        'archived': true,
                        'selected': false,
                        'status': "Archived"
                    }
                    FirebaseService.updateData(_newInfo, "/CUSTOM_NODE_EXT_HERE", id)
                        .then(
                        function () {
                            // Callback, additional functions, etc.
                        },
                        function (errorMessage: any) {
                            console.log(errorMessage);
                        });
                }
            }
        }
    };

    firebase.query(
        onQueryEvent,
        "/CUSTOM_NODE_NAME_HERE",
        {
            // true:  runs once, provides all data to onQueryEvent
            // false: loops onQueryEvent, row by row, continuous listening
            singleEvent: true,
            orderBy: {
                type: firebase.QueryOrderByType.CHILD,
                value: 'UID'
            },
            range: {
                type: firebase.QueryRangeType.EQUAL_TO,
                value: BackendService.token
            },
        }
    );
person piercove    schedule 18.07.2017