0

snap.val()this.Productslike this.Products= snap.val();に割り当てたいが、this.Productsはそのスコープでは未定義です。グローバル変数にsnap.val()を割り当てる方法は?

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(); 
      }); 
     } 

スナップが返されたとき、私は次のコードを試してみましたが、私はこのメッセージが表示さ - No index defined for uid:マイFirebaseデータベースを

snap.forEach(SnapShot=>{ 
console.log(SnapShot.val().name) 

を:

"Products" : { 
    "-Kbx0i-TFeTyRbNZAZ_8" : { 
     "category" : "1", 
     "detail" : "xxxxx details", 
     "name" : "xxxxx", 
     "uid" : "NW1Kq4WB7ReUz2BNknYWML9nF133" 
    } 

助けてください。ありがとう。

答えて

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の目的を全滅させることです。また、あなたが戻って(あなたがいない正確に一つの結果の配列を取得)あなたはおそらくthis.products = []を設定し、各child_added呼び出しにthis.products.push(snap.val())を使用したいthis.productsに取得し、各レコードを割り当てることにより、child_added誤使用しました

だから、あなたが本当にここで何をしたい、AngularFireのbuilt-in queriesを使用して、この全体の混乱を避けるためです:)

this.products = af.database.list('/Products', { 
    query: { 
    orderByChild: 'uid', 
    equalTo: 'NW1Kq4WB7ReUz2BNknYWML9nF133' 
    } 
}); 
関連する問題