2016-09-06 10 views
1

私は検索のためのフォーム入力を持っています。ユーザーが検索入力に何かを入力すると、2つの別々のAPIを呼び出す必要があります。これは私が達成しようとしているものです:Angular2オブザーブブルは共有する必要があります

myInput: new FormControl(); 
listOne: Observable<string[]>; 
listTwo: Observable<string[]>; 

ngOnInit(){ 
    this.listOne = this.myInput.valueChanges 
        .debounceTime(500) 
        .distinctUntilChanged() 
        .switchMap(myInput => this._service.getListOne(myInput)); 

    this.listTwo = this.myInput.valueChanges 
        .debounceTime(500) 
        .distinctUntilChanged() 
        .switchMap(myInput => this._service.getListTwo(myInput)); 
} 

だから私の質問は、どのように私はvalueChangesに加入し、2つの異なる配列を埋めるために2つの異なるAPIを呼び出すのですか?上記のコードでは、最初の検索でうまくいきますが、検索テキストを変更すると、getListTwoだけが呼び出されます。ソースは、いくつかの加入者を持っており、あなたがそれらの加入者(つまりあなたがマルチキャスト複数の加入者にソース値にしたい)そのソースから同じ値を読みたいときはいつでも

答えて

3

は、あなたがshare必要があります。 sharedSource = this.myInput.valueChanges.debounceTime(500).distinctUntilChanged().share()、例えばので:あなたは対マルチキャスト冷たい流れの詳細な説明hereで見ることができ

myInput: new FormControl(); 
listOne: Observable<string[]>; 
listTwo: Observable<string[]>; 

ngOnInit(){ 
    this.listOne = sharedSource 
        .switchMap(myInput => this._service.getListOne(myInput)); 

    this.listTwo = sharedSource 
        .switchMap(myInput => this._service.getListTwo(myInput)); 
} 

意味ここ

+0

はどのようにして、観察から退会するのでしょうか?私はsharedSourceまたはlistOne/listTwoから退会する必要がありますか?私は購読と呼んでいないので、購読中止のように見えます。 – garethb

+0

まあ、サブスクリプションはどこかで呼び出されます。そうでなければ、それはフレームワークです。つまり、フレームワークもサブスクライブを中止します。そのサブスクライブが呼び出されると、上位ストリームもサブスクライブ解除されます。だからこそ、あなたは何もする必要はありません。 – user3743222

+0

正しいです、Angular2を使用し、ng-forのasyncパイプは、フレームワーク内で観測可能で購読/取消しを受け取ります。例えばng-for = "let x of listOne | async" <=これはsubscribe/unsubscribesです – garethb

1
ngOnInit(){ 
    input$ = this.myInput.valueChanges.debounceTime(500) 
         .distinctUntilChanged() 
         .share(); 

    this.listOne = input$.switchMap(myInput => this._service.getListOne(myInput)); 
    this.listTwo = input$.switchMap(myInput => this._service.getListTwo(myInput)); 

    //store subscriptions 
    this.subs$.push(input$,this.listOne,this.listTwo); 
} 

メモリリークを避けるために解除することを忘れないでください:

ngOnDestroy(){ 
    this.subs$.forEach(s => s.unsubscribe()); 
} 
+0

私はそれを取ると思いますが、配列としてサブ$を宣言する必要があります?なぜ登録を保存するのですか?それは唯一の退会に使用されていますか? – garethb

+0

@garethb 'Array >'です。私はそれらを保存するので、私は退会してメモリリークを避けることができます。たとえば、別のコンポーネントやサービスに渡す必要がある場合は、サブスクリプションを保存することもできます。 – BeetleJuice

+0

私は配列として宣言しなければならなかったが、今はすべて動作している。通知を解除する+1のために! – garethb

関連する問題