Я пытаюсь показать наблюдаемое всего в моем угловом компоненте, например:
total$ | async
Это должна быть сумма вычисления для всех строк в корзине покупок:
totalAmount = sum of (price * unitsOrdered)
Мои интерфейсы:
export interface IBasketLine {
unitsOrdered?: number;
price?: number;
}
export interface IBasket {
header?: IBasketHeader;
lines?: Array<IBasketLine>;
}
Мой угловой компонент содержит 2 наблюдаемых :
basket$: Observable<IBasket>;
nettoTotal$: Observable<number>;
Наблюдаемая корзина $ инициализированаиз моего магазина ngrx и все строки видны на мой взгляд.Это моя ngOnInit функция:
ngOnInit(): void {
this.store.dispatch(new basketActions.Load());
this.basket$ = this.store.pipe(
select(fromBasket.getBasket)
);
this.nettoTotal$ = this.basket$.pipe(
map((basket) => basket.lines),
reduce( ??? )
);
}
Как я могу использовать функцию уменьшения, чтобы получить правильную сумму в моем представлении?
Обновление:
Это работает, однако:
this.nettoTotal$ = this.basket$.pipe(
map((basket) => {
if (basket) {
return basket.lines;
} else {
return [];
}
}),
map((lines) => {
let total = 0;
for (const line of lines) {
const val = Math.round((line.bestelaantal * line.nettoprijs * 100) / 100);
total = total + val;
}
return total;
})
);
Обновление 2:
Этот код работает, когда я напрямую вызываю метод моего сервиса, который возвращает Observable of IBasket:
this.nettoTotal$ = this.basketService.getBasket().pipe(
map((basket) => basket.lines),
map((lines) => lines.map((line) => line.nettoprijs * line.bestelaantal).reduce(
(accumulator, linePrice) => accumulator + linePrice,
0
))
);
Этот код НЕ работает, когда я использую наблюдаемое из моего магазина:
this.nettoTotal$ = this.basket$.pipe(
map((basket) => basket.lines),
map((lines) => lines.map((line) => line.nettoprijs * line.bestelaantal).reduce(
(accumulator, linePrice) => accumulator + linePrice,
0
))
);