Я использую конвейер в своем приложении angular для фильтрации значений параметров на основе введенных пользователем данных. Этот фильтр используется на уровне поля формы, которая динамически генерируется с использованием цикла ngFor и основана на ответе json.
Я могу использовать концепцию канала для фильтрации значения для отдельного одиночного ввода, но когда я использую его несколько раз, используя Ngfor Loop, как в приведенном ниже коде, он работает не идеально.
// formdata is coming as of json response from a http request
<div *ngFor="let input1 of formdata.formfields">
<mat-select placeholder="Select something" [formControlName]="input1.field_name">
<ngx-mat-select-search [(ngModel)]="searchText" [ngModelOptions]="{standalone: true}" placeholder="Select {{input1.title}}"></ngx-mat-select-search>
// here I am using 'fitleroptions' pipe after ngFor and passing searchText ngmodel input binding
<mat-option *ngFor="let opt_value of input1.enumNameGroups | filteroptions : searchText; let i = index" value={{input1.value}}>{{opt_value}}</mat-option>
</mat-select>
// other input types like file, text etc....
</div>
Это дает мне такой результат.
Теперь проблема в том, что searchText, назначенный ngmodel, не может использоваться более одного раза, поскольку он ограничен только одним входом, и если я это сделаю, он также повлияет на другие входы.
Как передать [(ngmodel)] = "some_variable" и затем назначить его для filteroptions: "some_variable", чтобы они были ограничены только одним входом выбора ???
Таким образом, проблема также может быть выражена в том, как передать динамическое имя ngmodel и назначить это имя параметрам конвейера?
Это канал filteroptions, который я использую.
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'filteroptions'
})
export class FilterOptionsPipe implements PipeTransform {
transform(items: any[], searchText: string): any[] {
if(!items) return [];
if(!searchText) return items;
searchText = searchText.toLowerCase();
return items.filter( it => {
console.log("got item array here",items);
return it.toLowerCase().includes(searchText);
});
}
}