为什么我的 dataSnapshot.val() 等于 null?
Why is my dataSnapshot.val() equal to 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");
});
数据库:
"posts" {
"fun" {
"-Kzugwouzgafsdbkuzbf" {
"time": 1478443829263
}
"-Krugwouzgafawdrawdr" {
"time": 1478446164691
}
}
}
问题:
为什么我的dataSnapshot.val()
等于null
?
N.B.:
我想按时间戳排序帖子并查询最近的 5 个。
您将时间戳存储为字符串,但传递的是数字。
"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"
"THE VALUE:2, [object Object]"
"6"
见http://jsbin.com/tucufor/edit?js,console
对于以后的问题:如果您在 jsbin 中重现该问题,就像我在回答时所做的那样,我们都将轻松获得您的问题所需的最少代码+json。
更新
由于您指出要将时间戳存储为数字,因此对该行为的解释有所不同。当 ordering/filtering 数值时,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"
"THE VALUE:2, [object Object]"
"6"
代码:
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");
});
数据库:
"posts" {
"fun" {
"-Kzugwouzgafsdbkuzbf" {
"time": 1478443829263
}
"-Krugwouzgafawdrawdr" {
"time": 1478446164691
}
}
}
问题:
为什么我的dataSnapshot.val()
等于null
?
N.B.:
我想按时间戳排序帖子并查询最近的 5 个。
您将时间戳存储为字符串,但传递的是数字。
"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"
"THE VALUE:2, [object Object]"
"6"
见http://jsbin.com/tucufor/edit?js,console
对于以后的问题:如果您在 jsbin 中重现该问题,就像我在回答时所做的那样,我们都将轻松获得您的问题所需的最少代码+json。
更新
由于您指出要将时间戳存储为数字,因此对该行为的解释有所不同。当 ordering/filtering 数值时,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"
"THE VALUE:2, [object Object]"
"6"