Ваш метод getItems()
возвращает Observable
, содержащий ваш список элементов.Вы должны подписаться на этот Observable
, чтобы получить предметы.
Кроме того, вы можете использовать BehaviorSubject
для добавления списка в Observable
каждый раз, когда список изменяется.
Таким образом, ваши потребители услуг будут получать уведомления через заметку, когда будет добавлен элемент.
@Injectable()
export class BasketService {
private list: Item[] = [];
private subject = new BehaviorSubject<Item[]>([]);
private list$ = this.subject.asObservable();
add(product: Product, units: number): void {
let item: Item = new Item();
item.product = product;
item.units = units;
this.list.push(item);
this.subject.next(this.list); // push the modified list to notify observers
}
getItems(): Observable<Item[]> {
return this.list$;
}
}
Используйте это так:
export class MyComponent implements OnInit {
constructor(private service: BasketService) { }
ngOnInit() {
this.service.getItems().subscribe(items => {
console.log('list modified', items); // this is executed after each list.push()
});
}
}
Вы также можете использовать scan
с Subject
и избавиться от переменной list
.Список будет создан оператором scan
путем добавления к предыдущим значениям:
@Injectable()
export class BasketService {
private subject = new Subject<Item>();
private list$ = this.subject.pipe(
scan((list, item) => [...list, item], [] as Item[]),
);
add(product: Product, units: number): void {
let item: Item = new Item();
item.product = product;
item.units = units;
this.subject.next(item);
}
getItems(): Observable<Item[]> {
return this.list$;
}
}
Вот короткая демонстрация Stackblitz с использованием оператора сканирования.