2017-04-09 9 views
1

firebaseデータベースから項目を取得してリストに入れることでリストを作成しようとしています。私はfirebaseからわずか3項目をつかんでいます。ここ角度2の "_this is undefined"を解決する方法

this.angFire.database.list('/SpareParts', { 
    query: { 
    orderByChild: '', 
    limitToFirst: this.limit // this is a BehaviorSubject<number>(3) 
    } 
}).subscribe(items => items.forEach(item => function f(j) { 
    setTimeout(() => { 
    console.log('timeout'); 
    this.items.push(item); 
    if (--j) f(j); 
    }, 3000) 
}.bind(this)(3))); 

:周りの検索多くの後、私は私のコードでは、このポイントに到達しました。コードはある意味では機能します。 、私はエラー

this is undefined

になっていたこの前

_this is undefined

:それは、リスト内で同時に3つのアイテムをプッシュし、それが行わだ後、それはエラーでクラッシュし、setTimeoutをを通過します

私はまだ動作しなかった.bind関数を使用しました。

これについてアドバイスをいただければ幸いです。ありがとうございました。

+0

関数f(j)はであるべきである(J)=> {}、実際は(J)=> {} iは関数f(j)を変更することにより、この – Sorikairo

+0

@Sorikairoにアクセスすることができなくなるためもう自己呼び出し関数を持つことができないので、コードのその部分をすべて変更しなければならないと思います。 – drdream100

+0

@ drdream100これはすべて非常に怪しい感じです。なぜあなたはsetTimeoutでラップしているのですか?そして、いいえ、最初に呼び出されているコールバック関数だと考えると、fを再呼び出しできるとはどういうふうに思えますか? –

答えて

0

これは関数外の変数として格納し、その参照を使用してコンポーネントを参照します。

var self = this; // <-- store here 
this.angFire.database.list('/SpareParts', { 
    query: { 
    orderByChild: '', 
    limitToFirst: this.limit // this is a BehaviorSubject<number>(3) 
    } 
}).subscribe(items => items.forEach(item => function f(j) { 
    setTimeout(() => { 
    console.log('timeout'); 
    self.items.push(item); // <-- use here 
    if (--j) f(j); 
    }, 3000) 
}.bind(this)(3))); 
+0

これは何らかの理由で、最初は "self is undefined"というエラーが表示されました。しかし、コードを再構築した後、期待どおりに動作しています!なぜそれが起こるのか分かりません。どうもありがとうございました!! – drdream100

+0

@ drdream100ああうれしかった:-) – echonax

関連する問題