2017-01-16 2 views
4

単一のObservableを返す単一のServiceがあります。今私はあまりにも多くのコードを書くことなく、このObservableから複数の結果を取得するための正しい/最も効率的な方法を探しています。Angular2 +非同期パイプ:単一Observaleから複数の値を取得

  • MyServiceObservable<Array<Foo>>

  • MyComponentコールmyService.getFoos()とすべき出力アレイ、およびアレイの全体の長さ、及び図示されていない要素の数から最初の5つの要素を返します。

は、ここに私の現在のコードです:

@Injectable() 
export class MyService { 
    foos = new BehaviorSubject<Array<Foo>>([]); 

    getFoos() { 
    return this.foos.asObservable(); 
    } 
} 



@Component({ 
    template: ` 
    Total: {{ totalCount | async }} 
    Omitted: {{ (totalCount | async) - (maxFiveItems | async).length }} 
    <div *ngFor="let item of maxFiveItems | async"> 
     {{item.bar}} 
    </div> 
    ` 
}) 
export class MyComponent { 
    totalCount: Observable<number>; 
    maxFiveItems: Observable<Array<Foo>>; 

    constructor(myService:MyService) { 
    this.totalCount = myService.getFoos() 
     .map(arr => arr.length); 

    this.maxFiveItems = myService.getFoos() 
     .map(arr => arr.slice(0, 5)); 
    } 
} 

結果は正常に見えるが、私はasyncパイプを4回使用しています。それは(私が知る限り)4つのサブスクリプションにつながります。これは私が推測するすべての必要はありません(?)もちろん


私は手動でMyComponentconstructor以内に加入した後、asyncパイプなしに住むことができます。しかし、私は自分自身の脱会を世話しなければなりません。

これを処理する他の方法はありますか?

答えて

4

内側のmyService.getFoos()share()演算子を使用していると仮定して何も問題はありません。そのため、すべてのasyncパイプはソースと同じサブスクリプションを共有します。この例のようにBehaviorSubjectを使用している場合は、問題ありません。

あなたがコンストラクタで自分自身を購読することについて述べたことは、すぐに私の心に来たものです。私は問題として手動のサブスクリプションが表示されません。

+0

私は 'BehaviorSubject'で' share'を使うべきではないと私は思いません。 サブスクリプションについて、複数の値を発行できるものを手動で購読する場合(これは、動作の対象となるケースです)、購読を解除する必要があります。そうしないと、メモリリークが発生します。基本的には、コンポーネントに 'OnDestroy'インターフェースを実装することになります。 – Melou

+0

それからAppart、私はあなたに同意する:@ベンジャミンのアプローチは完全に良いようだ。 – Melou

+1

私はAngular 4の次回のFeatureを読んでいます:** ngIf async pipeを使って**(参照:https://netbasal.com/a-taste-from-angular-version-4-50be1c4f3550)。これは、これらのマルチサブスクリプションシナリオのいくつかを解決する可能性があります。 –

関連する問題