我想将snap.val()
分配给this.Productslike this.Products= snap.val();
,但this.Products
在该范围内未定义。
Products: FirebaseListObservable<any>;
constructor(){
}
ionViewDidLoad(){
this.angularFire.database.list('/Products').$ref.orderByChild('uid')
.equalTo('NW1Kq4WB7ReUz2BNknYWML9nF133').on('child_added', function(snap){
console.log(snap.val().name);
//this.Products= snap.val();
});
}
我在返回snap时尝试了以下代码,但收到此消息 - No index defined for uid
:
snap.forEach(SnapShot=>{
console.log(SnapShot.val().name)
我的Firebase数据库:
"Products" : {
"-Kbx0i-TFeTyRbNZAZ_8" : {
"category" : "1",
"detail" : "xxxxx details",
"name" : "xxxxx",
"uid" : "NW1Kq4WB7ReUz2BNknYWML9nF133"
}
请帮忙。感谢。
答案 0 :(得分:1)
直接回答您提出的问题,您可以使用ES6 arrow function:
let query = this.angularFire.database.list('/Products').$ref.orderByChild('uid')
.equalTo('NW1Kq4WB7ReUz2BNknYWML9nF133');
query.on('child_added', (snap) => this.Products= snap.val());
或者,对于ES5兼容性,请将this
声明为变量:
let self = this;
let query = this.angularFire.database.list('/Products').$ref.orderByChild('uid')
.equalTo('NW1Kq4WB7ReUz2BNknYWML9nF133');
query.on('child_added', function(snap) {
self.Products= snap.val();
});
但实际上,这是一个XY problem,你不想要你想要的东西。
您所做的就是自己重新实现列表,并打败AngularFire2的整个目的,AngularFire2代表您处理所有这些同步。
此外,当你想要设置{{child_added
时,你错误地使用this.products
将你得到的每条记录(你得到的结果数组,而不仅仅是一条)分配给this.products = []
。 1}}然后对每个child_added调用使用this.products.push(snap.val())
。
所以你真正想要的是使用AngularFire的built-in queries并避免整个混乱:)
this.products = af.database.list('/Products', {
query: {
orderByChild: 'uid',
equalTo: 'NW1Kq4WB7ReUz2BNknYWML9nF133'
}
});
答案 1 :(得分:0)
我是这样做的:
import firebase from "firebase";
const firebaseConfig = {
your firebaseConfig...
};
let app = firebase.initializeApp(firebaseConfig);
let database = firebase.database();
export async function readFromFirebase(userId, key) {
const ref = database.ref("users/" + userId + "/" + key);
const snapshot = await ref.once("value");
return snapshot.val();
}
async function main() {
console.log(await readFromFirebase(109512127, "userName"));
}
main();