无法在Material Multiselect Angular 6

时间:2018-08-29 13:16:58

标签: angular angular-material multi-select

我正在尝试使用Material在Angular中实现多选。

在“编辑”模式下打开页面时,应在“多选”中将某些类型选择为默认类型,但在我的情况下不起作用。

下面是HTML:

 <mat-form-field >
      <mat-select  placeholder="DocTypes" [(value)]="selectedDocType" formControlName="docTypes" multiple>
        <mat-option  *ngFor="let doc of docs" [value]="doc.name">{{doc.name}}</mat-option>
      </mat-select>
    </mat-form-field>

我正在按如下所示填充SelectedDocType:

  selectedDocType: string[] = new Array();
 resp.forEach(x => {
                    this.selectedDocType.push(x.name);
                  });

此处的resp包含正确的文档类型。例如简历。

奇怪的是,当我按如下所示设置selectedDocType时,它会起作用:

this.selectedDocType = ["CV"];

但是,当我如上所述按下每个下时,它不起作用。他们两个在数组中都有1个值。

我在做什么错了?

更新:文档格式如下:

export interface DocTypes{
  id: string;
  name: string;
}

2 个答案:

答案 0 :(得分:2)

该问题是材料选择的已知问题。 它按对象引用选择,而不按值选择。

  • 这就是为什么它仅适用于字符串但不适用于实际对象的原因...

您可以使用名为compareWith的内置指令很容易地覆盖该行为

这里有些stackblitz demo for you to get the concept

HTML:

<mat-form-field>
  <mat-select multiple [(ngModel)]="selectedObjects" [compareWith]="comparer">
    <mat-option *ngFor="let iobject of allObjects" [value]="iobject">{{iobject.name}}</mat-option>
  </mat-select>
</mat-form-field>

组件:

interface obj {
  name: string,
  value: number
}

@Component({
  selector: 'select-multiple-example'
})
export class SelectMultipleExample {

  selectedObjects : obj[];

  allObjects : obj[] = [
    {name: 'AAA', value: 1},
    {name: 'BBB', value: 2},
    {name: 'CCC', value: 3}
  ];

  ngOnInit() {
    // define default selection
    this.selectedObjects = [{name: 'AAA', value: 99}, {name: 'CCC', value: 99}];    
  }

  comparer(o1: obj, o2: obj): boolean {
    // if possible compare by object's name property - and not by reference.
    return o1 && o2 ? o1.name === o2.name : o2 === o2;
  }
}

答案 1 :(得分:0)

谢谢大家的帮助。

问题在于响应的分配,因为我直接将响应分配给了变量。

相反,我必须首先将值分配给局部变量,然后将值分配给selectedDocType并起作用:

name: [];
 for (var i = 0; i < resp.length; i++) {
                name[i] = resp[i].id;
              }
this.selectedDocType = name;

通过这种方式,为selectedDocType分配了所需的正确值。