単一のObservableを返す単一のServiceがあります。今私はあまりにも多くのコードを書くことなく、このObservableから複数の結果を取得するための正しい/最も効率的な方法を探しています。Angular2 +非同期パイプ:単一Observaleから複数の値を取得
MyService
Observable<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つのサブスクリプションにつながります。これは私が推測するすべての必要はありません(?)もちろん
私は手動でMyComponent
のconstructor
以内に加入した後、async
パイプなしに住むことができます。しかし、私は自分自身の脱会を世話しなければなりません。
これを処理する他の方法はありますか?
私は 'BehaviorSubject'で' share'を使うべきではないと私は思いません。 サブスクリプションについて、複数の値を発行できるものを手動で購読する場合(これは、動作の対象となるケースです)、購読を解除する必要があります。そうしないと、メモリリークが発生します。基本的には、コンポーネントに 'OnDestroy'インターフェースを実装することになります。 – Melou
それからAppart、私はあなたに同意する:@ベンジャミンのアプローチは完全に良いようだ。 – Melou
私はAngular 4の次回のFeatureを読んでいます:** ngIf async pipeを使って**(参照:https://netbasal.com/a-taste-from-angular-version-4-50be1c4f3550)。これは、これらのマルチサブスクリプションシナリオのいくつかを解決する可能性があります。 –