我有一个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>
我已尝试将selected2
和mat选项中的
值设置为对象及其id,并尝试在
mat-select
中同时使用[(value)]
和[(ngModel)]
,但都不起作用。
我使用的是材料版本2.0。0-β。10
我在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>
使用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;
}
对模板中的值使用绑定。
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