2017-10-29 8 views
7

を派遣するために、店舗とngOnInitに選択するために、コンストラクタを使用して私の質問はngrxストアからを選択 & を派遣に関するものです。ストアから

のは、公式の例アプリから次のコードを見てみましょう:

export class CollectionPageComponent implements OnInit { 
    books$: Observable<Book[]>; 

    constructor(private store: Store<fromBooks.State>) { 
    this.books$ = store.select(fromBooks.getBookCollection); 
    } 

    ngOnInit() { 
    this.store.dispatch(new collection.Load()); 
    } 
} 

私はconstructorから選択ngOnInitから派遣の選択の動機を理解したいと思います。

誰でも説明をお願いしますか?

P.S.ところで、上記はngrxサンプルアプリケーションのサンプルコードです。https://github.com/ngrx/platform/blob/master/example-app/app/books/containers/collection-page.ts

+0

あなたを混乱させるようなことはありますか?何かをするには多くの方法があります。これは間違った方法ではありません。あなたは、あなたのアプリが起動した瞬間から始まるリゾルバまたはhttpポーリングで同じことをすることができます。 – notANerdDev

答えて

-1

私の意見では主な理由は懸念の分離です。 コンストラクタはすべての依存関係を定義した場所です。だから、この場合は店を取得し、それを選択するよりも。

アクションをディスパッチすることは、(可能であれば)依存関係から分離できるロジックの一部です。

多くの依存関係とたくさんのアクションがあるクラスを考えてみましょう。これは物事を分離しておくのに役立ちます。 クラスを読むすべての人は、コンストラクターを常に見て、依存関係が他のロジックと混乱していないことを確認できます。

+0

こんにちはウィーラー。これが事実だと確信していますか?それは角度成分のライフサイクルと 'constructor'と' ngOnInit'の違いとは関係ありませんか? – balteo

+0

これは依存しているかもしれませんが、コンストラクタでディスパッチアクションを使用する前に、何の問題も副作用もありませんでした。 – wheeler

0

クラスがインスタンス化されたときにコンストラクタが実行され、クラスフィールドの適切な初期化が保証されます。 これは、Angularがコンストラクタで引数として渡す可能性のあるプロバイダを解決する場所です。

ngOnInitライフサイクルフックは、データバインドプロパティが初めてチェックされた後に呼び出されます(コンポーネントの入力&の入力)。 詳細については、this questionを参照してください。

は限り私はそれを理解するようngOnInitからを派遣コンストラクタとにngrxストアからを選択するための動機は、を選択するとあなたのコンポーネントクラスを初期化するの一部であるということです。 this.books$はObservableなので、コンストラクタで初期化して、作成直後に使用できる状態にしておくのが理にかなっています。 bookCollection.Load()this.books$の値を出力すると仮定すると、this.books$は、の前にその書籍の観測可能性があり、の前に最終的な値が出力されます。

this.books$に出力される値は、ディスパッチ ngOnInitのアクションになります。この方法で、this.books$が初期化されていることを確かめることができます。

This answer同様の質問にも役立つ場合があります。

関連する問題