2016-05-13 27 views
1

私は、CRUD APIを持っています。ここでは、エンティティのgetは、リストと現在のフィルタ設定の項目の合計数の両方を返します。例えばRxjs Observable:1つのAPI呼び出しで異なる値をサブスクライブする

GET /posts

{ 
    "items": [ 
     { 
      "id": 1, 
      "title": "post title 1" 
     } 
     ... 
    ], 
    "total": 9 
} 

がどのようにHTTPクエリが一度だけ実行されますが、どこが合計値やアイテムのリストのいずれかに加入することができる場所に観察を作成することができますか?

私はtypescriptでAngular2コンテキストにいます。

は、私が最初にこれを試してみました、それが働いた:

this.http.get('/api/posts').map(response => response.json()).subscribe(data => { 
    var items = data.items 
    var total = data.total 
}); 

をしかし、私はポストのエンティティのための私のインターフェイスを使用することはできません(または私はこれは本当にないこと{items: Post, total: number}のようなインターフェイスを定義しなければなりませんように私はこれが好きではありません優雅な)。私がしたいのは次のようなものです:

this.myPostService.totalObservable.subscribe(total => this.total = total) 
this.myPostService.itemsObservable.subscribe(items => this.items = items) 

しかし、2つのクエリをトリガーしないでください。

私はこのブログ投稿に目を通しました:https://coryrylan.com/blog/angular-2-observable-data-servicesですが、最初に購読してからlist()メソッドを呼び出してリストを読み込むのは嫌です。

+0

こんにちは@paulpdaniels。私はいくつかの例で私の質問を更新しました。 – jobou

答えて

2

あなただけが直接値をキャッシュすることができたら、それは実行する必要がある場合:あなたがする必要がある一方、場合

var totalObservable = source.pluck('total'); 
var itemsObservable = source.pluck('items'); 

var source = this.http.get('/api/posts').map(response => response.json()).publishLast(); 

//unsubscribe from this when you are done 
var subscription = source.connect(); 

を次にあなたがように2つのソースを公開することができますこれらObservablesを複数回呼び出すと、getがトリガー対象のObservableおよびキャッシュにラップされることをお勧めします。

2番目のケースでは、sourceTriggerはボタンイベントに接続されている可能性があるObservableとなるため、各ボタンをクリックすると新しい要求がトリガーされます。

+0

あなたの2番目のソリューションは、まさに私が探していたものでした。ありがとう。私は 'pluck'メソッドを知らず、ドキュメントでそれを見つけることができませんでした。 – jobou

+0

ソースで 'share'を使用して、クエリが2回発行されないようにしなければなりませんでした。 – jobou

+0

'cache'は' share' + 'replay'だけで、同じように機能するはずです。 – paulpdaniels

関連する問題