如何在FormArray中使用mat-autocomplete(Angular Material Autocomplete)(Reactive Forms)

问题描述 投票:3回答:1

假设我有以下表单结构:

  this.myForm = this.formBuilder.group({
          date: ['', [Validators.required]],
          notes: [''],
          items: this.initItems()

        });
  initItems() {
    var formArray = this.formBuilder.array([]);
    for (let i = 0; i < 2; i++) {
      formArray.push(this.formBuilder.group({
        name: ['', [Validators.required]],
        age: ['', [Validators.required]],
      }));
    }

    return formArray;
  }

并且名称控件应该是自动完成,如何将所有名称控件与自动完成列表相关联?

angular angular-material angular6
1个回答
4
投票

我通过将name中的每个FormArray控件与filteredOption数组相关联来解决这个问题:

  ManageNameControl(index: number) {
    var arrayControl = this.myForm.get('items') as FormArray;
    this.filteredOptions[index] = arrayControl.at(index).get('name').valueChanges
      .pipe(
      startWith<string | User>(''),
      map(value => typeof value === 'string' ? value : value.name),
      map(name => name ? this._filter(name) : this.options.slice())
      );

  }

然后每次我在formgroup(创建新项目)中构建一个form Array,我需要在新索引上调用上面的函数,如下所示:

  addNewItem() {
    const controls = <FormArray>this.myForm.controls['items'];
    let formGroup = this.formBuilder.group({
      name: ['', [Validators.required]],
      age: ['', [Validators.required]],
    });
    controls.push(formGroup);
    // Build the account Auto Complete values
    this.ManageNameControl(controls.length - 1);

  }

在.html文件中,我们需要引用所需的filteredOption数组,我们可以使用i索引来完成:

  <mat-option *ngFor="let option of filteredOptions[i] | async " [value]="option">
  {{ option.name }}
  </mat-option>

请在这里查看详细的答案https://stackblitz.com/edit/angular-szxkme?file=app%2Fautocomplete-display-example.ts

© www.soinside.com 2019 - 2024. All rights reserved.