角材料:使用反应形式时,垫选择默认值

时间:2019-05-17 13:24:33

标签: angular angular-material angular7 reactive-forms

我使用反应性形式和有角材料 mat-select 创建了一个形式,用于创建名为“ 核心”的对象。核心对象具有2个属性:“名称”和“所有者”。 “所有者”属性是 IUser 对象的数组。

核心对象:

export interface ICore {
  id?: number;
  name: string;
  owners: IUser[];
}

表格:

<form [formGroup]="parentForm">
      <mat-form-field class="example-full-width">
        <input matInput formControlName="name" placeholder="Name">
      </mat-form-field>

      <mat-form-field class="example-full-width">
        <mat-label>Users</mat-label>
        <mat-select formControlName="owners" multiple>
          <mat-option *ngFor="let user of users" [value]="user"> {{ user.username }}</mat-option>
        </mat-select>
      </mat-form-field>
    </form>

用户”变量是可以选择的所有可用用户的数组。

 users: IUser[];

该表单很好用,但现在我想使用相同的表单来编辑核心对象,为此,我需要在加载页面时在“所有者”表单控件中显示核心所有者。

表单创建:

  createForm() {
    this.coreForm = this.formBuilder.group({
      name: ['', [Validators.required]],
      owners: ['', [Validators.required]]
    });
  }

我如何获得核心:

getCore() {
    this.coreService.getCore(this.route.snapshot.params['id'])
      .subscribe(
        res => {
          this.core = res;
          this.updateForm();
        },
        err => this.toastr.error('Core has not been received!', 'Error!')
      );
  }

表单更新(适用于name属性)

  updateForm() {
        this.coreForm.patchValue({
          name: this.core.name,
          owners: this.core.owners
        });
      }

但是未添加所有者列表。奇怪的是,如果我使用 users 用户更新表单,则它会起作用:

  getUsers() {
    this.usersService.getUsers()
    .subscribe(
      res => {
        this.users = res;
        this.coreForm.patchValue({
          owners: res
        });
      },
      err => this.toastr.error('User could not be received!', 'Error!')
    );
  }

这样,所有用户都被添加为默认值。但是对于核心所有者来说,这是行不通的。知道我在这里做错了吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

您需要使用[compareWith]伪指令定义标准,基于该标准将对象视为已选择:

<form [formGroup]="parentForm">
      <mat-form-field class="example-full-width">
        <input matInput formControlName="name" placeholder="Name">
      </mat-form-field>

      <mat-form-field class="example-full-width">
        <mat-label>Users</mat-label>
        <mat-select [compareWith]="compareFunction" formControlName="owners" multiple>
          <mat-option *ngFor="let user of users" [value]="user"> {{ user.username }}</mat-option>
        </mat-select>
      </mat-form-field>
</form>

并定义您的compareFunction:

compareFunction(o1: any, o2: any) {
 if(o1.name == o2.name && o1.id == o2.id ) return true; else return false;
}

答案 1 :(得分:0)

我同意以上答案,我正在为具有Angular垫选择和使用反应式形式的用户发布此信息。

您可以使用Angular Reactive表单的patchValue来选择默认值

在组件中的ngOnInit()中

或您希望下拉列表选择值的任何位置 调用patchValue函数,如下代码:

  this.yourFrom.patchValue({
      CategoryID:1
    });