-1

Code:Warum ist mein dataSnapshot.val() gleich null?

app.controller('ctrl', function ($scope, $firebaseArray, $timeout) { 

    $scope.data = []; 
    var _start = 0; 
    var _end = 4; 
    var _n = 5; 

    console.log("1"); 

    $scope.getDataset = function() { 
     console.log("4"); 
     fb.orderByChild('time').startAt(_start).endAt(_end).limitToLast(_n).on("value", function(dataSnapshot) { 
      console.log("5"); 
      $scope.data.push(dataSnapshot.val()); 
      console.log("THE VALUE:"+dataSnapshot.val()); 
      console.log("6"); 
     }); 

     console.log("7"); 


     _start = _start + _n; 
     _end = _end + _n; 

     console.log("8"); 
    }; 

    console.log("2"); 

    $scope.getDataset() 

    console.log("3"); 

}); 

DATABASE:

"posts" { 
    "fun" { 
     "-Kzugwouzgafsdbkuzbf" { 
      "time": 1478443829263 
     } 
     "-Krugwouzgafawdrawdr" { 
      "time": 1478446164691 
     } 
    } 
} 

FRAGE:

Warum ist meine dataSnapshot.val() gleich null?

N. B .:

Ich möchte die Beiträge von Zeitstempel, um zu bestellen und die 5 letzten Abfrage.

+0

Bitte geben Sie die minimalen, vollständigen Informationen (JSON + Code) ein, die zur Reproduktion des Problems benötigt werden. Also die eigentlichen Daten, die Sie abfragen, und die Abfrage mit hartcodierten Werten für '_start',' _end' und '_n'. –

+0

@FrankvanPuffelen Fertig. –

+0

Danke.Geben Sie nun auch den minimalen tatsächlichen JSON an, der benötigt wird. Und schließlich: Wie stellen Sie fest, dass 'snapshot.val()' 'null' ist? Nichts in dem Code, den Sie freigegeben haben, zeigt seinen Wert an. –

Antwort

1

Sie speichern die Zeitstempel als Zeichenfolgen, aber übergeben Zahlen.

"time": "1456273845127" 
var _start = 0; 

Vergleichen von Strings zu Zahlen wird nicht funktionieren. Wenn Sie in Zeichenfolgen übergeben, funktioniert es:

fb.orderByChild('time').startAt("0").endAt("4").limitToLast(5).on("value", function(dataSnapshot) { 
    console.log("5"); 
    console.log("THE VALUE:"+dataSnapshot.numChildren()+', '+dataSnapshot.val()); 
    console.log("6"); 
}); 

Drucke:

"5"

"DER WERT: 2, [object Object]"

"6"

Siehe http://jsbin.com/tucufor/edit?js,console

Für zukünftige Fragen: Wenn Sie das Problem in einer JSBIN reproduzieren, wie ich für meine Antwort, haben wir beide den minimalen Code + JSON für Ihre Frage in Reichweite.

aktualisieren

Da Sie angegeben, dass Sie die Zeitstempel als Zahlen sind zu speichern, ist die Erklärung für das Verhalten anders. Beim Bestellen/Filtern von numerischen Werten führt Firebase einen numerischen Vergleich durch. Und der aktuelle Zeitstempel ist viel größer als der 4, den Sie in Ihrem Code verwenden.

fb.orderByChild('time').startAt(0).endAt(Date.now()).limitToLast(5).on("value", function(dataSnapshot) { 
    console.log("5"); 
    console.log("THE VALUE:"+dataSnapshot.numChildren()+', '+dataSnapshot.val()); 
    console.log("6"); 
}); 

Das gibt mir eine Liste von zwei Elemente wieder:

"5"

"WERT: 2, [object Object]"

"6"

+0

Hoppla. Mein Fehler: Die Zeitstempel sind eigentlich Ints, nicht Strings:/ –

+0

Ich habe gerade gemerkt, dass ich startAt und endAm missbraucht habe. Jetzt reparieren. –