2

AsyncPipeはBehaviorSubjectで動作しますが、空のデータでサービスを初期化したくないため、Subject inteadを使用します。Angular 2.0.1 AsyncPipeがRx Subjectで動作しない

問題はNgForで、asyncPipeはSubjectで動作しません。問題ですか?

これは動作します:

コンポーネント:

export class AppComponent { 
    foo = new BehaviorSubject<Array<number>>([1,2,3]); 

    getFoo(){ 
    return this.foo.asObservable(); 
    } 
} 

テンプレート

<span *ngFor="let e of foo.asObservable() | async">{{e}}</span> 

これませワークス:

コンポーネント

ここ
export class AppComponent { 
    foo = new Subject<Array<number>>(); 

    constructor(){ 
    setTimeout(() => { 
      this.foo.next([1,2,3]); 
    }, 3000); 
    } 

    getFoo(){ 
    return this.foo.asObservable(); 
    } 
} 

テンプレート

<span *ngFor="let e of foo.getFoo() | async">{{e}}</span> 
+0

問題を再現するためにフィドル/プランクを提供できますか? – estus

+0

update @estusを参照してください。 – Serginho

+0

問題は '.asObservable()'だと思います。 – estus

答えて

4

問題は私のテンプレートからメソッドを呼び出している - これは、変化検出を実行するたびに意味、私が観察できるの新しいインスタンスを返しますあなたからgetfoo()関数を呼んでいますこれは、非同期パイプをリセットします。

したがって、NgForでgetFoo()を呼び出しても、コードは失敗します。

Solucionでは、コンポーネントに観測可能な変数を作成します。

+0

あなたはテンプレート内のどこでも 'getFoo()'を呼び出すことはありません。 – martin

+0

申し訳ありませんが、間違ったケースで私は 'getFoo()'を作成しましたが、ビューで呼び出すことを忘れました。私はちょうどそれを今更新する。とにかく、私は 'asObservable()'を呼び出していたのと同じ動作でした。ありがとう。 – Serginho

+0

愚かな私、あなたは変更の検出について正しいです! – martin