Joh*_*ews 32 javascript firebase firebase-realtime-database
我正在尝试查询我的数据库,以便它根据子键检索有序列表.我这样做(见下文),但没有任何反应,这意味着它返回一个完全按照存储在Firebase数据库中的方式排序的对象.到底是怎么回事?
self.getAllProfiles = function () {
var qProfile = $q.defer();
var ref = new Firebase(FBURL);
ref.child("users").orderByChild('last_update').on("value", function (snapshot) {
console.log(snapshot.val()) // HERE IS WHERE IT SHOULD BE ORDERED
qProfile.resolve(snapshot.val());
}, function (errorObject) {
qProfile.reject(errorObject);
});
return qProfile.promise;
};
Run Code Online (Sandbox Code Playgroud)
要添加,我的用户节点如下所示:
users
/$username
/last_update
/id
/data
/profile_image
/display_name
Run Code Online (Sandbox Code Playgroud)
这是一个快照:
Tester: Object
github: Object
last_update: 1447732462170
userId: "github:12345"
Run Code Online (Sandbox Code Playgroud)
Fra*_*len 83
当您调用时snapshot.val(),您将返回一个JSON对象.JSON对象中的键顺序由浏览器决定,而不是由Firebase决定.
为了让孩子们顺序:
self.getAllProfiles = function () {
var qProfile = $q.defer();
var ref = new Firebase(FBURL);
ref.child("users").orderByChild('last_update').on("value", function (snapshot) {
snapshot.forEach(function(child) {
console.log(child.val()) // NOW THE CHILDREN PRINT IN ORDER
});
qProfile.resolve(snapshot.val());
}, function (errorObject) {
qProfile.reject(errorObject);
});
return qProfile.promise;
};
Run Code Online (Sandbox Code Playgroud)
您可以将q.resolve()呼叫保留在原来的位置:snapshot.forEach()不是异步呼叫.
use*_*289 15
我知道这个问题已经回答并且已经超过1年了,但由于评论部分仍有一些混淆,我想补充一些信息.
最初的问题是OP想要根据Firebase实时数据库中的子密钥检索有序列表,但是.orderByChild('arg')不能按预期工作.
但是没有按预期工作的不是.orderByChild('arg'),但是.on("value", callback).因为.on("value", callback)与其他eventTypes有点不同.on("child_added", callback).
假设我们有一个firebase实时数据库,如下所示:
{
myData: {
-KYNMmYHrzLcL-OVGiTU: {
NO: 1,
image: ...
},
-KYNMwNIz4ObdKJ7AGAL: {
NO: 2,
image: ...
},
-KYNNEDkLpuwqQHSEGhw: {
NO: 3,
image: ...
},
}
}
Run Code Online (Sandbox Code Playgroud)
-
如果我们使用.on("value", callback),callback()将被调用1次,并返回3个对象的Object Array.
ref.on("value", function(snapshot) {
console.log(snapshot.val());
// Please see Frank van Puffelen's answer
}
Run Code Online (Sandbox Code Playgroud)
-
如果我们使用.on("child_added", callback),callback()将被调用3次,每次返回一个Object,并按顺序返回它们.
ref.once("child_added", function(snapshot) {
console.log(snapshot.val());
// The objects are returned in order, do whatever you like
}
Run Code Online (Sandbox Code Playgroud)
如果您只需要从firebase获取有序数据(例如初始化UI).那么ref.orderByChild('arg').once("child_added", callback)适合您,它简单易用.
但是,如果由于某种原因需要使用ref.orderByChild('arg').on("value", callback),请参阅Frank van Puffelen的回答.
请阅读Firebase文档,了解有关on(eventType, callback, cancelCallbackOrContext, context)其参数及其返回值的更多信息.
另一个有用的文档:使用Web上的数据列表
使用value事件监听器订购:
firebase.database().ref('/invoices').orderByChild('name').on('value', snapshot => {
snapshot.forEach(child => {
console.log(child.key, child.val());
});
}
Run Code Online (Sandbox Code Playgroud)
如果您想颠倒顺序,请尝试:
function reverseSnapshotOrder (snapshot) {
let reversed = [];
snapshot.forEach(child => {
reversed.unshift(child);
});
return reversed;
}
reverseSnapshotOrder(snapshot).forEach(child => {
console.log(child.key, child.val());
});
Run Code Online (Sandbox Code Playgroud)
请参阅:https : //firebase.google.com/docs/database/web/lists-of-data#listen_for_value_events
| 归档时间: |
|
| 查看次数: |
16986 次 |
| 最近记录: |