angular - Angular2: Summer to Observable<number>-verdier
Jeg har en tjeneste med to forskjellige funksjoner som får antall elementer i en array som overvåkes av en BehaviorSubject.
private itemsInCartSubject: BehaviorSubject<any[]> = new BehaviorSubject([]);
private itemsInCart: any[] = [];
private packetsInCartSubject: BehaviorSubject<Pacote[]> = new BehaviorSubject([]);
private packetsInCart: Pacote[] = [];
public getTotalItens(): Observable<number> {
return this.itemsInCartSubject.map((items: any[]) => {
return items.reduce((prev, curr: any) => {
return prev + Number(curr.qtd);
}, 0);
});
};
public getTotalPacotes(): Observable<number> {
return this.packetsInCartSubject.map((items: any[]) => {
return items.reduce((prev, curr: any) => {
return prev + Number(1);
}, 0);
});
};
Inne i komponenten min har jeg to metoder for å få disse tallene:
public countItens(): Observable<number> {
return this.cartService.getTotalItens();
}
public countPacotes(): Observable<number> {
return this.cartService.getTotalPacotes();
}
I min HTML kan jeg vise verdiene på denne måten:
<p>You have {{countItens() | async}} in your cart</p>
Det fungerer fint, oppdaterer verdiene når det er en endring i emnet, men jeg trenger å summere de to verdiene til de to Observables.
Hvordan kan jeg oppnå det?
Jeg har prøvd
this.cartService.getTotalItens()+this.cartService.getTotalPacotes();
Men det genererer feilen: Operator '+'' kan ikke brukes på typene Observable og Observable
Svar #1
Du kan kombinere disse Observables ved å bruke combineLatest og deretter returnere en ny verdi som er summen av begge. Du kan legge til en ny funksjon som dette:
public getTotal(): Observable<number> {
return this.countItens()
.combineLatest(this.countPacotes(), (itens, pacotes) => itens + pacotes);
}
Og så kan du bruke det i malen slik:
<p>Total is: {{getTotal() | async}}</p>
