Делайте не используйте Observables таким образом в CartComponent.Вместо этого напишите:
@Component({
selector: 'app-cart',
templateUrl: './cart.component.html',
styleUrls: ['./cart.component.css']
})
export class CartComponent {
public readonly files = biscan(
this.cartService.addFileToCart$,
this.cartService.removeFileFromCart$,
(filesArray, file) => [filesArray, file],
(filesArray, file) => filesArray.filter(f => f !== file),
[]
),
startWith([]),
);
constructor(private modalService: NgbModal, private cartService: CartService) {
}
open(content) {
this.modalService.open(content);
}
}
В шаблоне используйте files | async
везде, где вы в данный момент используете fileArray
.
В других компонентах используйте files
в качестве наблюдаемого везде, где вы в данный момент используете fileArray
или pcFileArray
.
Основная проблема заключается в том, что checkOrderedFiles
никогда не вызывается - если вы пишете вызывающий код, этот код никогда не узнает, когда fileArray
изменилось.
Интуитивно, вы пытаетесь «сбежать» из Observable, чтобы вернуть свои изменения в статический мир компонента.Это просто невозможно.Как только вычисление происходит в асинхронной стране Обсерваторий, оно остается там.
К сожалению biscan()
(изменение с двумя наблюдениями scan
) в настоящее время не находится вбиблиотека, но вы можете написать это как
const biscan = (leftObs, rightObs, leftFcn, rightFcn, initialValue) =>
new Observable(observer => {
let acc = initialValue;
// this function must be called *twice* (once for left,
// once for right) before the observer is completed.
let complete = () => {
complete = () => observer.complete();
};
const makeSub = (obs, f) => obs.subscribe(v => {
acc = f(acc, v);
observer.next(acc);
},
e => observer.error(e),
() => complete()
);
const leftSub = makeSub(leftObs, leftFcn);
const rightSub = makeSub(rightObs, rightFcn);
return () => {
leftSub.unsubscribe();
rightSub.unsubscribe();
};
});
Редактировать: исправлены опечатки в biscan()