@ Люцифер, все не работает так, как ты думаешь. Угловой не магический. Не беспокойтесь об этом, на первый взгляд это распространенная ошибка. Когда вы подписываетесь на Observable, Angular не ставит «старшего брата», чтобы посмотреть, что происходит с данными. например когда мы подписываемся на httpClient.get (url), который обращается к dbs, любое изменение dbs Angular не учитывает этого. (он не может этого сделать).
Итак, вам нужно создать сервис, который говорит, что Angular учитывает изменения: вам нужно использовать Предмет подобного. Позвольте мне показать сервис, который работает
private _filterByGenre:string[];
private filterByGenreSource = new Subject<any>();
filterByGenreObservable=this.filterByGenreSource.asObservable();
get filterByGenre()
{
return this._filterByGenre
}
set filterByGenre(value) //when we use dataService.filterBtGenre=...
{
this._filterByGenre=value; //equal to the private variable
this.filterByGenreSource.next(value) //say to Angular that something change
}
Вы можете подписаться на filterByGenreObservable
this.dataService.filterByGenreObservable.subscribe(data => {
this.selectedCategories = [...data]; //(*)
});
//(*) is we make simply this.selectedCategories=data, we can not see the data change
//so, I used the spread operator
Если мы сделаем что-то вроде
this.dataService.filterByGenre = this.selectedCategories;
Поскольку мы используем установщик, создайте новое значение
Хорошо, я не использую p-флажок, но вы можете быть кодом этого ответа в этом stackblitz
Обновление ну, очевидно, мы хотим сделать «что-то» при изменении категории.
Представьте, что у нас есть массив allBooks, и мы хотим фильтровать по выбранным категориям. Но сначала мы собираемся изменить данные, которые мы отправляем в службу пользователя, чтобы сделать их более похожими на p-флажок, поэтому я изменяю свою функцию categoryFileterSelect для отправки в массиве, а не [true, false, false, true] else ["Horror" "Научная фантастика"]
categoryFilterSelect() {
this.dataService.filterByGenre =
this.options.filter((x, index) => this.selectedCategories[index]);
}
Итак, мы можем написать
this.userService.filterByGenreObservable.subscribe(
data => {
this.filteredBooks=this.allBooks.filter(x=>data.indexOf(x.genre)>=0)
},
error => null,
() => console.log("error")
);
Хорошо, сначала я хочу сделать видимым вызов со значением this.userService.filterByGenre, поэтому я использую оператор rxjs startWith, и, наконец, моя подписка становится такой, как
this.userService.filterByGenreObservable.pipe(
startWith(this.userService.filterByGenre))
.subscribe(
data => {
this.filteredBooks=data?this.allBooks.filter(x=>data.indexOf(x.genre)>=0)
:this.allBooks
},
error => null,
() => console.log("error")
);