-1

CODE:なぜ私のdataSnapshot.val()は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 
     } 
    } 
} 

QUESTION:

私のdataSnapshot.val()nullと等しいのはなぜですか?

N.B:

私は、タイムスタンプによる投稿を注文し、5最新のを照会します。

+0

問題を再現するために必要な最小限の完全情報(JSON +コード)を含めてください。したがって、あなたが照会する実際のデータと、 '_start'、' _end'、 '_n'のハードコードされた値を持つクエリです。 –

+0

@FrankvanPuffelen完了。 –

+0

ありがとうございます。今でも必要なJSONを最小限に抑えてください。そして最後に、 'snapshot.val()'が 'null'であるとどう思いますか?共有したコードのどれも、その価値を表示しません。 –

答えて

1

あなたは文字列としてタイムスタンプを保存していますが、数字を渡しています。

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

数字と文字列の比較は機能しません。あなたは、文字列を渡すと、それは仕事のことを行います

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"); 
}); 

プリント:

"5"

"VALUE:2、[オブジェクトのオブジェクト]"

"6"

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

今後の質問:jsbinで問題を再現した場合、私の回答のように、質問に必要な最小限のコード+ jsonを簡単に手に入れることができます。

更新

あなたが数字としてタイムスタンプを保存していることが示されているので、動作の説明は異なっています。数値を注文/フィルタリングするとき、Firebaseは数値比較を行います。現在のタイムスタンプは、コードで使用している4よりも大きくなります。

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"); 
}); 

これは再び私に二つのアイテムのリストを返す:

"5"

"VALUE:2、[対象オブジェクト"

"6"

+0

私の悪い:タイムスタンプは実際には文字列ではなくintsです:/ –

+0

私はちょうど私がstartAtとendAtを悪用したことに気付きました。今修正。 –