当前位置: 首页 > 知识库问答 >
问题:

角度材质:材质选择不选择默认值

周滨海
2023-03-14

我有一个mat select,其中的选项是数组中定义的所有对象。我试图将该值设置为其中一个选项的默认值,但是当页面呈现时,该值处于选中状态。

我的typescript文件包含:

  public options2 = [
    {"id": 1, "name": "a"},
    {"id": 2, "name": "b"}
  ]
  public selected2 = this.options2[1].id;

我的HTML文件包含:

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

我已尝试将selected2mat选项中的值设置为对象及其id,并尝试在mat-select中同时使用[(value)][(ngModel)],但都不起作用。

我使用的是材料版本2.0。0-β。10


共有3个答案

卢锋
2023-03-14

我在mat select中使用Angular 5和reactive forms,但无法获得上述任一解决方案来显示初始值。

我不得不添加[compareAnd]来处理在matt-Select组件中使用的不同类型。在内部,mat-Select似乎使用数组来保存选定的值。如果打开该模式,这可能会允许相同的代码在多个选择下工作。

角度选择控制文件

以下是我的解决方案:

初始化窗体控件的窗体生成器:

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

然后在组件上实现compareWith功能:

compareIds(id1: any, id2: any): boolean {
    const a1 = determineId(id1);
    const a2 = determineId(id2);
    return a1 === a2;
}

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

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

最后,将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>
笪德华
2023-03-14

使用compareBy,一个函数来比较选项值和所选值。请参见这里:https://material.angular.io/components/select/api#MatSelect

对于具有以下结构的对象:

listOfObjs = [{ name: 'john', id: '1'}, { name: 'jimmy', id: '2'},...]

像这样定义标记:

<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>

并定义如下比较函数:

compareObjects(o1: any, o2: any): boolean {
  return o1.name === o2.name && o1.id === o2.id;
}
燕朝明
2023-03-14

对模板中的值使用绑定。

value="{{ option.id }}"

应该是

[value]="option.id"

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

<mat-select [(value)]="selected2">

应该是

<mat-select [(ngModel)]="selected2">

完整代码:

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

从版本2.0开始,在旁注上。0-β。12物料选择现在接受一个mat表单字段元素作为父元素,因此它与其他物料输入控件一致。升级后,将div元素替换为mat 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>
 类似资料:
  • 我使用的是:Angular 4.4.5@Angular/Material:2.0.0-beta.12

  • 我正在尝试使用一个有角度的材质(7.0)选择列表,如下所述。 页面上的示例代码片段是 使用TS文件中定义的,如其代码片段所述: 对我来说很有意义,但是当我尝试编译时,我得到了错误: 我已将导入到我的应用程序模块中。 我没有看到与要导入的列表选项相关的其他模块。 我错过了什么?

  • 我使用Angular 7.2创建一个选择控件,如下所示: 这正是我们想要的。我有一些代码希望删除选定的项目,大致如下: 虽然这会将其从选定项的数组中删除。如果我从选择控件中选择新值,则所有原始项仍被选中(即勾选)。 如何清除所选项目? 根据@Maarti的响应,我的代码现在可以使用

  • 我需要能够从角材料列表中删除选定的项目。为此,我决定从初始项目数组中减去选定项目数组(不确定这是最好的方法)。 我的问题是,我找不到一种方法来将超文本标记语言中的选定项数组传递给TS并使用它。 Angular材料在其留档中有以下示例: 其中x是mat-seltion-list选择器的ID,y是对所选元素执行的操作。但这似乎只适用于超文本标记语言。 下面是我不工作的代码。 HTML,其中我设置了列表

  • 我有一个非常简单的角度材料选择组件,从一个对象数组填充。我尝试了ngModel和component select属性的双向绑定,但两者都不能像预期的那样工作。 我所期望的:更改选择的选项将相应地更新ngModel值。 实际发生的情况:更改selected选项会触发select change方法,但不更新binded属性。 如何再现:选择选项2,然后回到选项1,只播放2个选项。 转载位置:https

  • 我遇到过这篇文章,当选择在输入之后时效果很好,但是在输入之前如何将它与mat select一起使用呢?一旦我切换顺序,组件就变得不可用,字段内的每次单击都会触发选择。 在一个表单字段中输入和选择角度材质 我的叉子:https://stackblitz.com/edit/angular-6nqzf1-ox413y?file=app/form-字段概述示例。html