Angular 2+: поиск в данных json, когда поиск является общим компонентом
app.component имеет данные json, отображаемые в представлении, используя * ngfor. Пользователь может выполнять поиск по мере ввода в поле поиска (в основном по событию keyup).
Для удобства в будущем я сделал этот search.component общим компонентом.
Я написал код и хочу знать, если это правильный подход или даже лучше, существует. Пожалуйста, помогите.
Примечание. В настоящее время код содержит 7 записей, но фактические записи будут составлять не менее 1000.
Вот мой пример POC для приложения.
search.component.html - для каждого введенного символа вызывается метод getSearchString ()
<input type="text" placeholder="type here to search" (keyup)="getSearchString(text)" #text>
search.component.ts - использование субъекта _searchText, определенного в общем сервисе, для выдачи значения.
getSearchString(text) {
this.appService._searchText.next(text.value);
}
app.service.ts - определение используемого предмета.
_searchText = new Subject<string>();
getSearchText$ = this._searchText.asObservable();
app.component.ts - подписка на наблюдаемый getSearchText$ для поиска в json.
ngOnInit() {
this.data = [
{
name: 'pranjal',
id: 's1'
}, {
name: 'alini',
id: 's2'
}, {
name: 'nishank',
id: 's3'
}, {
name: 'pranvi',
id: 's3'
}, {
name: 'mayuri',
id: 's4'
}, {
name: 'malya',
id: 's5'
}, {
name: 'pravi',
id: 's5'
}
];
this.filteredData = JSON.parse(JSON.stringify(this.data));
this.appService.getSearchText$.subscribe((searchText) => {
this.filteredData = this.searchData(this.data, searchText);
});
}
searchData(data, searchText) {
let newData = [];
if (!searchText) {
newData = this.data;
} else {
newData = data.filter((obj) => {
return obj.name.includes(searchText);
});
}
return newData;
}
2 ответа
Ничего плохого в этом подходе. Различные способы достичь этого. В вашем случае вы используете наблюдаемые для отправки уведомления из поискового компонента в службу. Я бы сделал это наоборот, компонент поиска вызвал бы метод в службе поиска. Служба поиска затем опубликует результаты в заметной форме.
Вы смотрели на шаблон редукса? Очень рекомендую, особенно для больших приложений. Я использую ngrx в очень больших приложениях, и мне это нравится.
Все вроде бы хорошо - но у меня есть идея - вы можете просто отфильтровать ваши данные из component
где у вас есть исходные данные в вашем случае app.component.ts
имеет данные, так что просто вызвать событие от ребенка search.component.ts
и фильтровать данные
search.component.ts
@Output() searchText = EventEmitter<any>();
getSearchString(text) {
this.searchText.emit(text);
}
Каждый раз, когда текст изменяется, он изменит текст на ваш родительский компонент.
app.component.html
<child-component (searchText)="searchData($event)" ></child-component>
app.component.ts
searchData(event: any) {
let newData = [];
if (!event) {
newData = this.data;
} else {
newData = this.data.filter(obj => obj.name.includes(event));
}
this.data = [...newData];
}
Это будет ваш динамический компонент, когда вы используете этот компонент, он будет проходить текст поиска, и вы можете использовать это search
компонент в любом из ваших компонентов - Пожалуйста, не связывайте сервис в своем компоненте - если вы хотите обновить сервис, вам нужно изменить свой код - ваш компонент должен быть чем-то, что генерирует код по требованию, это должно быть что-то, что делает то же самое каждый раз
Надеюсь, это поможет вам - счастливого кодирования:)