так что в идеале вы также должны поделиться кодом своего провайдера cityService, так как он может иметь дополнительный контекст, который не виден из общего кода.
Теперь с кодом, которым вы поделились, я обнаружил 3 проблемы:
1-ая конкретная проблема в методе searchCities - в частности, в этой строке:
this.citiesTotal= this.citiesTotal.filter((city) => {...}
Обычно каждый раз, когда пользователь вводит в поле поиска, вы присваиваете this.citiesTotal его отфильтрованному подмножеству.Хотя в идеале вы должны хранить то, что вы отображаете для пользователя, как результат поиска, а исходный список городов должен быть отделен.
Попробуйте это:
searchCities(event) {
var val = event.target.value;
if (val && val.trim() != '') {
// here assign to "cities" instead of "citiesTotal":
this.cities = this.citiesTotal.filter((city) => {
return (city.name.toLowerCase().indexOf(val.toLowerCase()) > -1);
})
}
}
Теперь ваш код ts должен иметь разделение: - во время инициализациив конструкторе вы присваиваете данные обеим переменным (towns и townsTotal), но затем, основываясь на действиях пользователя, вы должны применять изменения только к переменным «city».
Во-вторых, вам не хватает логики при сбросе пользователем настроек поиска.См. официальный документ , для панели поиска есть специальный слушатель для этого: (ionCancel) = "onCancel ($ event)".В вашем коде TS вы должны иметь что-то вроде этого для сброса:
resetSearch(event) {
this.cities = this.citiesTotal;
}
И затем в вашем шаблоне вам нужно будет добавить (ionCancel) = "resetSearch ($ event)".
Третья проблема, которую я вижу в вашем шаблоне, заключается в том, что ваша привязка не указывает на правильные элементы:
<ion-searchbar showCancelButton="true" (ionInput)="searchCities($event) (ionCancel)="resetSearch($event)"></ion-searchbar>
<ion-list>
// here ensure your ngFor is pointing to the right var:
<ion-item *ngFor="let city of cities">
{{city.name}}
</ion-item>
</ion-list>
Попробуйте исправить все три проблемы и дайте мне знать, если вы с этим боретесь.