2017-08-02 19 views
2

私はここの記事次BehaviorSubjectを使用しています:著者は、単一のエントリのすべての項目とload()をロードするためにloadAll()を使用しているこの記事ではBehaviourSubjectを使用してすべてのアイテムと単一アイテムを取得する方法?

https://coryrylan.com/blog/angular-observable-data-services

load()は検索されたアイテムをdataStoreにプッシュし、next(...)ファンクションに送信され、すべてのユーザに通知されます。私はこれが正しいアプローチであるかどうか確信していません。なぜ私は分かりませんが、これは私たちのサービスをどのように設計すべきかということが私には奇妙に思えます。私はBehaviorSubjectを初めて使っているので間違っている可能性があります。だから私の質問は、これは正しい方法は、すべてのアイテムと単一のアイテムを取得するか、より良い方法はありますか?

答えて

2

私が見ているものから... wayより単純な解決策が十分である場合、あまりにも多くの開発者がBehaviorSubjectを使用しています。

BehaviorSubjectは、データがバインドされていないときにデータ変更を監視する複雑な要件がある場合にのみ必要です。そうしないと、単純なデータバインディングによって変更が監視されます。

これは私がすべてを取得し、1つを得るために、私のサービスを持っているコードです:

getProducts(): Observable<IProduct[]> { 
    return this._http.get<IProduct[]>(this._productUrl) 
     .do(data => console.log('All: ' + JSON.stringify(data))) 
     .catch(this.handleError); 
} 

getProduct(id: number): Observable<IProduct> { 
    return this.getProducts() 
     .map((products: IProduct[]) => products.find(p => p.productId === id)); 
} 

私はOPによって提供されるリンクからplunkerを変更し、私の結果はここにある:https://plnkr.co/edit/r5PMFprgoWbzmFPTK3xN?p=preview

注意NO BehaviorSubjectと同じ基本機能を提供し、より簡単なコードを提供します。観察可能

+0

私はデータの変更を監視する必要があります。 – user8408326

+0

投稿記事に基づいて質問しています。この記事が長い間多くのデータを返すとします。 – user8408326

+0

@deborak私はデータに特別なことをしていません。それをHTTP経由で取得し、それをあるエンティティにマッピングし、最後に 'ngFor'を使用してバインドします。データはかなり頻繁に変化します。 – user8408326

1

、件名& BehaviorSubject

Difference Between Observable and Subject

あなたが懸念している全てのデータ検索の場合は、DeborahKの答えはかなり右側にあります。通常、私は「普通」と軽く言っていますが、HTTPリクエストは標準的なものです。要求が出てきて、戻ってきて、何らかのデータを返し、新しい購読が行われるまで再開しません。ほとんどの観測可能なパターンでは、標準Observableタイプが仕事に最適です。

これについて考える最も簡単な方法は、名前を見ることです。観察可能。あなたがしているすべてがデータを取得している場合は、Observableがあなたの望むものです。ただし、インスタンシエーション後にデータストリームを操作する必要がある場合は、SubjectまたはBehaviorSubjectが適切です。 SubjectBehaviorSubjectの違いは、Subjectが初期値を持つ必要があることです。ここでBehaviorSubjectにはインスタンス化時に初期値が与えられます。

SubjectまたはBehaviorSubjectのユースケースの良い例は、Modalを表示するかどうかをアプリケーションに伝えるためにサイト全体で使用されるブール値です。複数のコンポーネントがモーダルの可視性の状態を変更する可能性があるため、変更可能なBehaviorSubjectが必要です。親コンポーネントがモーダルを表示するようトリガします。

Subjectのもう1つの良い例は、その内容をアプリケーション全体の他のコンポーネントにアドバタイズする検索バーです。ここで重要な点は、アプリケーション内の他のコンポーネント/サービスによって監視される新しい値をストリームに送出していることです。

私が最後に言うことは、上記のすべてが技術的にはObservableのカテゴリに該当するということです。私はそれが混乱の多くが起こる場所だと思う。私はあなたの質問について気付いてい

データをプッシュ

もう一つは、あなたが実際に角度自体の中に必ずしも解くことができないという問題を解決しようとしているように思えることがあります。 "バックエンド"内で、フロントエンドにプッシュしたい非常に動的なデータがある場合は、websocketソケットサーバーを調べる必要があります。それはそれよりも複雑に思えますが、基本的にサーバーがアプリケーションにデータを「プッシュ」することができます。安全なデータの場合は、サーバーを使用して「利用可能な更新プログラム」メッセージをプッシュし、アプリケーションが更新されたデータに対して安全にHTTP要求を行うようにすることをお勧めします。 Webソケットを介して安全な情報を送信しないでください。 Here is a great resourceノードサーバー内でソケットIOを使用して角型アプリケーションにプッシュするウェブソケット用。そこにはたくさんのことがあります。

+0

ありがとうございます。それは理にかなっている。私はしかし、データをプッシュしようとしていません。 – user8408326

+0

そして、私はあなたの2つの例が、BehaviorSubjectを必要とせずにAngularの変化の検出とバインドを利用すると言えるでしょう。 – DeborahK

+0

これは可能かもしれませんが、アプリの構造によって異なります。例えば、直接の親子ではないコンポーネント間の通信を試みたり、親モジュールと遅延ロードされたモジュールとの間で通信することさえも、標準的なデータバインディングを使用することは非常に困難になります。 – joshrathke

関連する問題