У меня угловой проект с функцией поиска. Мне нужно распечатать количество элементов поиска с поиском. Чтобы выполнить поиск, я фильтрую объект JSON с помощью поискового запроса и создаю новый массив с именем filterarray. Затем я беру длину фильтрующего массива и тоже распечатываю его. Но мне нужно распечатать его в другом компоненте, называемом search-count.component. Для этого я использую совместно используемый сервис count.service. Проблема в том, что когда я печатаю длину массива в привязке HTML, он будет печатать правильно, но компонент подсчета поиска имеет значение 0 alywas.
Search-Component.ts:
export class SearchResultComponent implements OnInit {
_postsArray: JsoncallItem[] = []; //JSON-array
value: string = ''; //search-term
filterarray: any = []; //filtered-array
count:string; //filtered-array-length
constructor(private data: SendDataService, private tot: CountService){}
getData(){
this.data.currentValue.subscribe(value => {this.value = value;
this.showData();
})
}
showData(){
if (this.value != null){
this.filterarray=
this._postsArray.filter(f =>
f.title.toLowerCase()
.includes(this.value.toLowerCase()))
.map(searchname=>searchname)
}
}
newCount(){
this.tot.currentCount.subscribe(count => this.count = count);
this.tot.changeCount(this.filterarray.length);
}
ngOnInit(): void{
this.getData();
this.newCount();
}
}
Search-Component.html:
{{filterarray.length}}
//show correct length
search-count.ts:
export class SearchCountComponent implements OnInit {
count: any;
constructor(private tot: CountService) {}
ngOnInit(): void {
this.tot.currentCount.subscribe(count => this.count = count);
}
}
search-count.html:
{{count}}
//show 0 always
count.service
export class CountService {
private countSource = new BehaviorSubject('');
currentCount = this.countSource.asObservable();
constructor() { }
changeCount(count: string) {
this.countSource.next(count)
}
}
вы имеете ввиду вместо подписки в search-count.ts?
console.info(this.filterarray.length) проверяет, показывает ли он правильное значение или нет





Я думаю, вам лучше использовать AfterViewInit, чем OnInit, поэтому значение будет обновляться всякий раз, когда изменяется длина filterarray. вы можете использовать AfterViewInit следующим образом
ngAfterViewInit(){
this.tot.currentCount.subscribe(count => this.count = count);
}
Я разобрался. Проблема в том, что я вызываю this.newCount(); в ngOnInit(), чтобы Он выполняется перед обновлением фильтра. Это было решено перемещением this.newCount(); в функцию getData() следующим образом:
getData() {
this.data.currentValue.subscribe(value => {
this.value = value;
this.showData();
this.newCount();
})
}
ngOnInit(): void {
this.getData();
}
Почему бы не возвращать напрямую поведенческий субъект? : getCount (): Observable <any> {return this.countSource.asObservable ();}