如何筛选显示在 table 中的 angular FormArray 数据

How to filter angular FormArray data which is displayed in a table

我想在名称输入字段中键入名称时过滤 FormArray 数据, 并根据 FormArray 数据控件中输入框输入的内容进行排序

 <tbody formArrayName="cards">
                  <tr class="custom" *ngFor="let card of cardsArray().controls; index as i; " [formGroupName]="i">
                    <td class="pr-0">
                      <input [attr.id]="'name'+i" class="form-control form-control-sm" formControlName="name"
                        [readonly]="true">
                    </td>
                    </tr>
                    </tbody>

您可以使用管道过滤 angular FormArray 数据

<input type="text" placeholder="Search" 
    [(ngModel)]="searchText"/>

      <tr *ngFor="let card of cardsArray |filter:searchText ">

在components.ts

    searchText : string;

Observable 来拯救! :)

将表单控件附加到您的搜索字段,监听它的变化并过滤值。 Return 模板的可观察对象并在那里使用异步管道。这是给您的示例,您只需更改变量名称以满足您的需要:

带表单控件的输入:

<input [formControl]="searchCtrl" placeholder="Search"/>

假设您的表单如下所示:

this.myForm = this.fb.group({
  formArr: this.fb.array([
    this.fb.group({
      formCtrl: ['one']
    }),
    //... more
  ])
});

// just a getter for your formarray
get formArr() {
  return (this.myForm.get('formArr') as FormArray).controls;
}

然后在组件中监听变化并执行上述过滤器。如果用户键入速度快,我喜欢在制作过滤器之前放置一个轻微的去抖动时间。

然后过滤后的 formArr$ 变量(这是一个可观察的):

formArr$ = this.searchCtrl.valueChanges.pipe(
  startWith(''),
  debounceTime(300),
  switchMap((val: string) => {
    return of(this.formArr as AbstractControl[]).pipe(
      map((formArr: AbstractControl[]) =>
        formArr.filter((group: AbstractControl) => {
          return group.get('formCtrl').value
           .toLowerCase()
           .includes(val.toLowerCase());
        })
      )
    );
  })
);

然后只需使用模板中的 async 管道:

<div *ngFor="let group of formArr$ | async; let i = index">
  <div formArrayName="formArr">
    <div [formGroupName]="i">
      <input formControlName="formCtrl">
    </div>
  </div>
</div>

就是这样!这是一个 DEMO 上面的代码