2017-01-15 9 views
2

このコード(Subjectから値を初期化する)が機能しない理由は何ですか?バグはありますか?私は間違って何をしていますか?Subject.nextがngOnInitで起動しない

TS

import { Component, OnInit } from '@angular/core'; 
import { Subject } from "rxjs"; 

@Component({ 
    selector: 'app-root', 
    templateUrl: './app.component.html', 
    styleUrls: ['./app.component.styl'] 
}) 
export class AppComponent implements OnInit { 
    itemSupplier$: Subject<any[]> = new Subject<any[]>(); 

    items: any[] = [ 
    {name: 'Item 1', value: 'item1'}, 
    {name: 'Item 2', value: 'item2'}, 
    ]; 

    ngOnInit(){ 
    this.itemSupplier$.next(this.items); 
    } 
} 

HTML

<ul> 
    <li *ngFor="let item of itemSupplier$ | async">{{item.name}}</li> 
</ul> 
+2

*「機能しません」*に展開できますか? – jonrsharpe

答えて

3

あなたはそれが動作のsetTimeoutでそれを投げる場合は、タイミングの問題のように思えます。

setTimeout(() => this.itemSupplier$.next(this.items), 0)

EDIT

それは実際にBehaviorSubjectを使用するには良いアイデアです。これは、購読されたときに最後の値を提供します。

+0

はい、私は質問を投稿した直後にそれを発見しましたが、この特定のケースで 'setTimeout'を使うことに頼るべき理由はまだ分かりません。 – user776686

+0

私はそれを角度でデバッグしました。非同期パイプはngOnInitの後にサブスクリプションを登録しないので、サブスクリプションなしで次のコールをするようです。 – Steveadoo

+0

あなたの努力に感謝します!あなたはそれがバグとして角かrxチームに報告されるべきだと思いますか?代わりにAfterInitを使用する必要がありますか? – user776686

0

私は同じ問題を抱えていましたが、解決策としてsetTimeoutが効果的でしたが、件名のswitchMap()メソッド出力が割り当てられたObservableがPRIORに次の呼び出しに登録されていた場合、setTimeoutを使用する必要はないことが判明しました。 )。この例では、Observableを作成し、非同期パイプを使用するのではなくプロパティを直接サブスクライブして更新する必要があります。

0

あなたはafterViewinitフックに次回の呼び出しを行うことができます。この時点で非同期パイプがサブジェクトにサブスクライブされます

関連する問題