2016-11-06 13 views
1

私はasObservableを公開するストアを持っています。ビューはこれにサブスクライブし、データを表示します。初めてデータを表示し、サブスクライブイベントがトリガーされていないページに初めてアクセスしたときに、シングルトンサービスに変更して以来、最初の負荷で作業していました。 subject.nextが更新され、ビューの更新やすべてがうまくいくようなデータ操作を行った後。Observerはコンポーネントへの最初のロード時に起動しません。

これは競合状態の問題ではなく、データがページのコンストラクタが呼び出された時点でストアに格納されていることを保証しています。購読これ

  • 成分コンストラクタと呼ばれる正しいデータと呼ばれる)

    1. データをサーバから
    2. subject.nextを(ロードされている:イベントの

      配列は、次のように(デバッグ中に確認された)でありますオブザーバ

    サブスクリプションイベントは発生せず、データが格納されません(ストアには存在します)。リストに何らかの種類の操作を実行すると、すべてが期待通りにカスケードされ、next()が呼び出され、サブスクライブイベントが発生します。

    ページの読み込み時にページを取得するにはどうすればよいですか?

    data.store

    protected _subject$: Subject<Array<any>>; 
    this._subject$.next(newData); // confirmed via console this happens with good data 
    
    get contacts$(): Observable<any> { 
        return this._subject$.asObservable(); 
    } 
    

    成分 - 私は両方がコンストラクタおよびngAfterViewInit以下にブロックを入れてみた、同じ結果

    // this happens after the above data is already set 
    this.contacts$.subscribe(data => { 
        // this block does not execute on page load 
        }); 
    
  • +0

    コードを追加できますか? – echonax

    +1

    この散文の説明から正確に何が起こっているのかを完全に把握するのは難しいです。プランナーで再現できますか? –

    +0

    関連ビットを追加しましたが、実際にはこのプロセスを管理するコードはあまりありません –

    答えて

    3

    イベントのシーケンスは次のとおりです(デバッグ):

    1. データをサーバからロードされ
    2. subject.next()が観察者に加入し
    3. コンポーネントのコンストラクタが呼び出された正しいデータと呼ばれること

    それはバニラためですSubjectは何もバッファしません。メッセージが送信されたときに、その時点で購読者がいない場合、メッセージは永遠に消え、誰もそれを受け取ることはありません。

    あなたが(すべての加入者のための)最後のメッセージバッファリングを維持したい場合は、あなたがBehaviorSubjectまたは意味的にReplaySubject

    import { BehaviorSubject } from 'rxjs/BehaviorSubject'; 
    import { ReplaySubject } from 'rxjs/ReplaySubject'; 
    
    sub1 = new BahaviorSubject<any>(null); 
    sub2 = new ReplaySubject<any>(1); 
    

    を使用することができ、BehaviorSubjectが時間とともに変化する値を表し、そしてあなたが初期化それは初期値です。次のアイテムがそれを押し出すまで、最後のアイテムは常にバッファされた状態に保たれます。

    ReplaySubjectのセマンティクスは、放出されたアイテムの数をバッファサイズまでバッファリングし、サブスクライブしたときにそのすべてをサブスクライバに送信することです。バッファサイズでReplaySubjectを初期化できます。バッファサイズが1の場合、それはBehaviorSubjectのように動作しますが、値で初期化する必要はありません。

    関連する問題