使用Firebase和Angular 5,我使用快照方法检索数据而不监听更改。我希望保留每个项目的索引/键,因为它用于链接以导航到所单击项目的页面。
这是TS:
features = [];
notfeatures = [];
constructor(private Svc: Service, private http: HttpClient){
firebase.database().ref('/reviews').once('value').then((snapshot)=> {
console.log("snapshot", (snapshot.val()));
..........
记录(snapshot.val())
给了我一个对象(我无法迭代):
-L6ZwjBbyi4jz21OEoST: {category: "Movies", contributor: "CF1", feature: "No", …}
randomkey1: {category: "Movies", contributor: "CF1", feature: "No", …}
randomkey2: {category: "Movies", contributor: "DS1", feature: "Yes", …}
randomkey3: {category: "TV", contributor: "KH1", feature: "No", …}
所以,我使用forEach
逐个获取所有项目,如果满足条件,则将它们推送到两个不同的数组。
..........
snapshot.forEach(snapshot => {
console.log(snapshot.key, snapshot.val());
if (snapshot.val().feature == "Yes") {
this.features.push(snapshot.val())
console.log("feature", this.features)
}
if (snapshot.val().feature == "No") {
this.notfeatures.push(snapshot.val())
console.log("notfeature", this.notfeatures)
}
});
})
}
然而,这样做意味着我失去了导航所需的snapshot.key
。
如何保存每个项目snapshot.key
以用于导航/数据目的?
答案 0 :(得分:1)
首先,你不能迭代snapshot.val()
返回的对象。您当然可以iterate over the key/value pairs in a javascript object使用for (x in y)
语法。
但是如果要在保留唯一键的同时迭代快照中的子节点,可以将该值放入子对象中:
const val = snapshot.val()
val.id = snapshot.key
this.features.push(val)
现在,您有一个快照对象,其中包含一个名为id
的新属性,其中包含唯一键。