如何将snap.val()分配给全局变量?

时间:2017-02-08 01:00:05

标签: angularjs firebase ionic-framework firebase-realtime-database ionic2

我想将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"
    }

请帮忙。感谢。

2 个答案:

答案 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();