#javascript #angular #typescript
#javascript #angular #typescript
Вопрос:
Я использую angular material в качестве фреймворка пользовательского интерфейса и использую компонент chip. Я фильтрую данные (массив объектов), и это работает довольно хорошо. Первая запись chip получает данные из базы данных, а остальные чипы фильтруют данные. Если я хочу удалить чип, исходные данные должны отображаться снова.
У меня есть две основные функции add () и remove (). С помощью add я добавляю чип в список и фильтрую данные. В функции remove() я использую filter() и every() helper, но помощник every () не выполняет итерацию по моему списку микросхем, и мое возвращаемое значение пустое
search data: any;
searchDataTmp: any;
searchDataReqTmp: any;
searchFieldValue: any;
add(event: MatChipInputEvent): void {
const input = event.input;
const value = event.value;
if ((value || '').trim()) {
this.searchFieldData.push({ name: value.trim() });
if (this.searchFieldData.length > 1) {
this.filterData(value);
} else {
this.requestData(value);
}
}
// Reset the input value
if (input) {
input.value = '';
}
}
filterData(item) {
this.searchData = this.searchData.filter((val) => {
return val.description.toLowerCase().includes(item.toLowerCase());
});
}
requestData(inputValue) {
this.loading = true;
this.apiService.callDataFromSource(inputValue).subscribe((item: any) => {
this.searchDataReqTmp = item;
this.searchData = this.searchDataReqTmp;
this.loading = false;
});
}
remove(data: any): void {
// e.g. this.searchFieldData = ['BarackObama', 'Trump'];
const index = this.searchFieldData.indexOf(data);
if (index >= 0) {
this.searchFieldData.splice(index, 1);
}
if (this.searchFieldData.length > 0) {
this.searchData = this.searchDataReqTmp.filter((val) => {
return this.searchFieldData.every((item) => {
return val.description.toLowerCase().includes(item.name.toString().toLowerCase());
});
});
} else {
this.searchData = this.searchDataTmp;
}
}
HTML
<mat-form-field class="search-field">
<mat-chip-list #chipList>
<mat-chip *ngFor="let inp of searchFieldData" [selectable]="selectable" [removable]="removable"
(removed)="remove(inp)">
{{inp.name}}
<mat-icon matChipRemove *ngIf="removable">cancel</mat-icon>
</mat-chip>
<input placeholder="Keyword..." [matChipInputFor]="chipList"
[matChipInputSeparatorKeyCodes]="separatorKeysCodes" [matChipInputAddOnBlur]="addOnBlur"
(matChipInputTokenEnd)="add($event)">
</mat-chip-list>
</mat-form-field>
В чем проблема и почему моя функция remove () не работает?
Мои данные выглядят так
РЕШЕНИЕ
remove(data: any): void {
const index = this.searchFieldData.indexOf(data);
// Deleting chips
if (index >= 0) {
this.searchFieldData.splice(index, 1);
}
// Data from requested data and filtering
if (index > 1) {
this.searchData = this.searchDataReqTmp.filter((val) => {
return val.description.toLowerCase().includes(this.searchFieldData[index - 1].name.toLowerCase());
});
}
// Data from first request
if (index === 1) {
this.searchData = this.searchDataReqTmp;
}
// Data from first initialising - ngOnInit()
if (index === 0) {
this.searchData = this.searchDataTmp;
}
}
Комментарии:
1. Вы можете передать индекс вместо данных и отфильтровать массив, используя этот индекс. Если данные являются объектом, описанным выше, логика не будет работать.
2. Или вы можете передать текст описания и отфильтровать массив с помощью .includes()
3. удалить(описание): void { this.searchData = this.searchDataReqTmp.filter((данные) => { вернуть данные.описание. toLowerCase() !== описание. toLowerCase(); }); }
4. Почему бы не удалить это вот так? удалить(данные: любые): void { this.searchFieldData.splice(данные, 1); } Но вместо данных передать индекс данных
5. Большое спасибо за вашу помощь. Я думаю, что нашел решение для себя. Я добавил это в свой вопрос выше.