#arrays #angular #forms #typescript #formarray
#массивы #angular #формы #typescript #formarray
Вопрос:
У меня есть список, который я преобразую в FormArray для генерации списка кнопок в html. Я хочу отфильтровать автомобили по имени
CarComponent.html
<input #searchBox id="search-box" (input)="search(searchBox.value)" />
<form [formGroup]="form" *ngIf="showCars">
<input type="button" class ="btn" formArrayName="carsList" *ngFor="let car of carsList$ | async; let i = index" value="{{carsList[i].name}}" >
</form>
CarComponent.ts
carsList$: Observable<Car[]>;
private searchTerms = new Subject<string>();
search(term: string): void {
this.searchTerms.next(term);
}
constructor(private formBuilder:FormBuilder,...)
{
this.form = this.formBuilder.group({
carsList: new FormArray([])
});
this.addButtons();
}
ngOnInit() {
this.spinner.show();
this.carsList$ = this.searchTerms.pipe(
debounceTime(300),
distinctUntilChanged(),
switchMap((term:string)=>
this.carsList ??? // Is this correct ?? What do I put here ?
)
}
private addButtons() {
this.carsList.map((o,i)=>{
const control = new FormControl;
(this.form.controls.carsList as FormArray).push(control);
})
}
export const CarsList: Car[] = [
{ name: 'Mercedes' },
{ name: 'BMW' },
{ name: 'Porsche' },
{ name: 'Cadillac' }
]
Итак, я хотел бы знать, как правильно выполнить фильтрацию, не используя канал по соображениям производительности.
Комментарии:
1. почему вы используете FormArray? FormArray используется, если у нас есть массив «входных данных», а не серия «кнопок»
2.
this.carsList ???
на самом делеthis.carsList$
просто для правильного понимания: вы хотитеconst CarList
отфильтровать в соответствии с предоставленным поисковым термином, а затем сгенерировать кнопки для каждого найденного автомобиля?3. Арикаэль, да. Я хочу отфильтровать CarsList, который содержит все автомобили. CarList$ — это наблюдаемая величина, которая будет содержать отфильтрованные элементы.
Ответ №1:
Вы можете использовать filter
функцию Array вместе с Array includes
для фильтрации значения в вашем FormArray
или Array
.
const CarsList = [
{ name: 'Mercedes' },
{ name: 'BMW' },
{ name: 'Porsche' },
{ name: 'Cadillac' }
];
const result = CarsList.filter(s => s.name.includes('Mercedes'));
console.log(result);