角度材质:mat-select不选择默认值

Wil*_*ore 76 typescript angular-material2 angular

我有一个mat-select,其中的选项是数组中定义的所有对象.我试图将值设置为默认值为其中一个选项,但在页面呈现时它将被选中.

我的打字稿文件包含:

  public options2 = [
    {"id": 1, "name": "a"},
    {"id": 2, "name": "b"}
  ]
  public selected2 = this.options2[1].id;
Run Code Online (Sandbox Code Playgroud)

我的HTML文件包含:

  <div>
    <mat-select
        [(value)]="selected2">
      <mat-option
          *ngFor="let option of options2"
          value="{{ option.id }}">
        {{ option.name }}
      </mat-option>
    </mat-select>
  </div>
Run Code Online (Sandbox Code Playgroud)

我曾尝试设置selected2valuemat-option给该对象和它的ID,并使用都不断地尝试[(value)][(ngModel)]mat-select,但没有正常工作.

我使用的是材料版本2.0.0-beta.10

谢谢

Igo*_*gor 103

对模板中的值使用绑定.

value="{{ option.id }}"
Run Code Online (Sandbox Code Playgroud)

应该

[value]="option.id"
Run Code Online (Sandbox Code Playgroud)

并在您选择的值中使用ngModel而不是value.

<mat-select [(value)]="selected2">
Run Code Online (Sandbox Code Playgroud)

应该

<mat-select [(ngModel)]="selected2">
Run Code Online (Sandbox Code Playgroud)

完整代码:

<div>
  <mat-select [(ngModel)]="selected2">
    <mat-option *ngFor="let option of options2" [value]="option.id">{{ option.name }}</mat-option>
  </mat-select>
</div>
Run Code Online (Sandbox Code Playgroud)

版本2.0.0-beta.12的旁注中,材质选择现在接受一个mat-form-field元素作为父元素,因此它与其他材质输入控件一致.升级后divmat-form-field元素替换元素.

<mat-form-field>
  <mat-select [(ngModel)]="selected2">
    <mat-option *ngFor="let option of options2" [value]="option.id">{{ option.name }}</mat-option>
  </mat-select>
</mat-form-field>
Run Code Online (Sandbox Code Playgroud)

  • "看起来你在与formControlName相同的表单字段上使用ngModel.在Angular v6中不支持使用ngModel输入属性和带有反应式表达指令的ngModelChange事件,并且将在Angular v7中删除.有关此内容的更多信息. ,请参阅我们的API文档:https://angular.io/api/forms/FormControlName#use-with-ngmodel" (6认同)
  • @ Igor-我们弄清楚了,该值以数字形式返回,然后用Mat选择它以寻找字符串。我们使用了[compareWith]指令 (2认同)

Bad*_*bet 62

使用compareWith,一种功能,用于将选项值与所选值进行比较.见这里:https://material.angular.io/components/select/api#MatSelect

对于以下结构的对象:

listOfObjs = [{ name: 'john', id: '1'}, { name: 'jimmy', id: '2'},...]
Run Code Online (Sandbox Code Playgroud)

像这样定义标记:

<mat-form-field>
  <mat-select
    [compareWith]="compareObjects"
    [(ngModel)]="obj">
       <mat-option  *ngFor="let obj of listOfObjs" [value]="obj">
          {{ obj.name }}
       </mat-option>
    </mat-select>
</mat-form-field>
Run Code Online (Sandbox Code Playgroud)

并定义比较函数如下:

compareObjects(o1: any, o2: any): boolean {
  return o1.name === o2.name && o1.id === o2.id;
}
Run Code Online (Sandbox Code Playgroud)

  • 处理对象而非简单数组时非常完美.谢谢. (3认同)

Hea*_*065 20

我正在使用带有mat-select的Angular 5和反应形式,并且无法获得上述任何一种解决方案来显示初始值.

我不得不添加[compareWith]来处理mat-select组件中使用的不同类型.在内部,看起来mat-select使用数组来保存所选值.如果打开该模式,这可能允许相同的代码与多个选择一起使用.

角度选择控制文档

这是我的解决方案:

表单生成器初始化表单控件:

this.formGroup = this.fb.group({
    country: new FormControl([ this.myRecord.country.id ] ),
    ...
});
Run Code Online (Sandbox Code Playgroud)

然后在组件上实现compareWith函数:

compareIds(id1: any, id2: any): boolean {
    const a1 = determineId(id1);
    const a2 = determineId(id2);
    return a1 === a2;
}
Run Code Online (Sandbox Code Playgroud)

接下来创建并导出determineId函数(我必须创建一个独立的函数,因此mat-select可以使用它):

export function determineId(id: any): string {
    if (id.constructor.name === 'array' && id.length > 0) {
       return '' + id[0];
    }
    return '' + id;
}
Run Code Online (Sandbox Code Playgroud)

最后将compareWith属性添加到mat-select:

<mat-form-field hintLabel="select one">
<mat-select placeholder="Country" formControlName="country" 
    [compareWith]="compareIds">

    <mat-option>None</mat-option>
    <mat-option *ngFor="let country of countries" [value]="country.id">
                        {{ country.name }}
    </mat-option>
</mat-select>
</mat-form-field>
Run Code Online (Sandbox Code Playgroud)


Ara*_*ind 14

你应该结合它[value]mat-option下面,

<mat-select placeholder="Panel color" [(value)]="selected2">
  <mat-option *ngFor="let option of options2" [value]="option.id">
    {{ option.name }}
  </mat-option>
</mat-select>
Run Code Online (Sandbox Code Playgroud)

现场演示


Bhu*_*mar 9

页面加载时,我在绑定第一个选项时遇到问题。下面有对我有帮助的解决方案

.html

<mat-form-field appearance="outline">    
    <mat-select #teamDropdown 
        [ngModel]="selectedGroupId" (selectionChange)="selectedGroupId=$event.value">
        <mat-option value=undefined>Please Select</mat-option>
        <mat-option *ngFor="let grp of groups" [value]="grp.groupsId">
            {{grp.groupName}}
        </mat-option>
    </mat-select>
</mat-form-field>
Run Code Online (Sandbox Code Playgroud)

.ts

@ViewChild('teamDropdown') teamDropdown: MatSelect;
ngAfterViewInit() {
    setTimeout(() => {
        this.teamDropdown.options.first.select();
    });
}
Run Code Online (Sandbox Code Playgroud)


mp3*_*415 6

正如在Angular 6中已经提到的,不建议使用ngModel以反应形式使用(并在Angular 7中将其删除),因此我如下修改了模板和组件。

模板:

<mat-form-field>
    <mat-select [formControl]="filter" multiple 
                [compareWith]="compareFn">
        <mat-option *ngFor="let v of values" [value]="v">{{v.label}}</mat-option>
    </mat-select>
</mat-form-field>
Run Code Online (Sandbox Code Playgroud)

组件的主要部分(onChanges省略了其他详细信息):

interface SelectItem {
    label: string;
    value: any;
}

export class FilterComponent implements OnInit {
    filter = new FormControl();

    @Input
    selected: SelectItem[] = [];

    @Input()
    values: SelectItem[] = [];

    constructor() { }

    ngOnInit() {
        this.filter.setValue(this.selected);
    }

    compareFn(v1: SelectItem, v2: SelectItem): boolean {
        return compareFn(v1, v2);
    }
}

function compareFn(v1: SelectItem, v2: SelectItem): boolean {
    return v1 && v2 ? v1.value === v2.value : v1 === v2;
}
Run Code Online (Sandbox Code Playgroud)

注意this.filter.setValue(this.selected)ngOnInit上面。

它似乎可以在Angular 6中使用。


LeO*_*LeO 5

您可以简单地实现自己的比较功能

[compareWith]="compareItems"

另请参阅文档。因此完整的代码如下所示:

  <div>
    <mat-select
        [(value)]="selected2" [compareWith]="compareItems">
      <mat-option
          *ngFor="let option of options2"
          value="{{ option.id }}">
        {{ option.name }}
      </mat-option>
    </mat-select>
  </div>
Run Code Online (Sandbox Code Playgroud)

并在Typescript文件中:

  compareItems(i1, i2) {
    return i1 && i2 && i1.id===i2.id;
  }
Run Code Online (Sandbox Code Playgroud)