我是Vue JS和Firebase中的新手。我的目标是获取所有具有相同类别的“事件”。我的意思是,让我有两个事件,一个事件类别为“ SMIX”,另一个为“ DAM”。现在我要获取事件类别为“ SMIX”的
created() {
var datos = []
firebase.database().ref('usuarios').on("value", data => {
data.forEach(function(user){
user.child("eventos").orderByChild("categoria").equalTo("SMIX")
.forEach(function(evento){
datos.push(evento.val())
});
});
this.eventos = datos;
});
}[My data Structure][1]
答案 0 :(得分:1)
您的代码中有一些错误和要注意的地方:
首先,如果您收到错误user.child(...).orderByChild is not a function
这是因为对于data.forEach(function(user) {...})
,user
是DataSnapshot
(请参阅forEach()
文档),并且通过在此DataSnapshot
上调用child()
方法您会得到另一个DataSnapshot
...,它没有orderByChild()
方法。
orderByChild()
方法是Reference
的方法,因此您需要这样做
user.child(...).ref.orderByChild()
使用DataSnapshot
的{{3}}属性
其次,您不能
user.ref.child("eventos").orderByChild("categoria").equalTo("SMIX")
.forEach()
因为您需要使用once()
或on()
方法来获取由Reference
表示的数据库位置的数据。
第三次,由于要在循环中执行多个查询,因此需要使用ref
方法而不是once()
方法。 on()
方法设置了一个侦听器,该侦听器连续地“侦听特定位置的数据更改”。
最后,请注意,您需要使用on()
来管理对数据库的并行异步查询。
因此,在注意了以上所有要点之后,以下代码就可以解决问题(放入created()
):
var datos = []
firebase.database().ref('usuarios').once('value')
.then(dataSnapshot => {
var promises = [];
dataSnapshot.forEach(user => {
promises.push(user.ref.child("eventos").orderByChild("categoria").equalTo("SMIX").once('value'));
});
return Promise.all(promises);
})
.then(results => {
//console.log(results);
results.forEach(dataSnapshot => {
dataSnapshot.forEach(evento => {
datos.push(evento.val());
});
});
this.eventos = datos;
});