ald*_*ldo 9 typescript angular-material angular
我有一个类Offer,它有一个属性"units"作为对象数组.
export class Offer {
public propertyA: string;
public propertyB: string;
public units: Unit[];
}
export class Unit {
public code: string,
public name: string,
public checked: boolean
}
Run Code Online (Sandbox Code Playgroud)
我使用的是Angular2,这些单位必须是用户可以选择的复选框.我也使用棱角分明的材料.
html代码如下:
<div *ngFor="let unit of model.units; let i=index">
<mat-checkbox [(ngModel)]="model.units[i].checked"
id="units[{{i}}]" name="units[{{i}}]">
{{ unit.name }}
</mat-checkbox>
</div>
Run Code Online (Sandbox Code Playgroud)
units属性使用以下方式加载:
this.model.units.push(new Unit("code1","name1", false));
this.model.units.push(new Unit("code2","name2", false));
this.model.units.push(new Unit("code3","name3", false));
Run Code Online (Sandbox Code Playgroud)
当我发送表单时,checked属性不包含选中的值.
我究竟做错了什么??
Sri*_*ri7 13
添加[checked]="unit.checked"和删除ngModel,id以及name从您的mat-checkbox.当你加载页面时,这会以单向绑定方式进行,但是要进行双向绑定工作,你需要做类似这样的事情,这是我在项目中完成的:
传递$eventon change并手动设置组件文件中的值:
将您的HTML更改为:
<div *ngFor="let unit of model.units">
<mat-checkbox [checked]="unit.checked"
(change)="valueChange(model.units,unit,$event)">
{{ unit.name }}
</mat-checkbox>
</div>
Run Code Online (Sandbox Code Playgroud)
将其添加到组件文件:
valueChange(model.units, unit, $event) {
//set the two-way binding here for the specific unit with the event
model.units[unit].checked = $event.checked;
}
Run Code Online (Sandbox Code Playgroud)
编辑/更新:最近为双向绑定找到了一个解决方案,而没有明确地处理它
确保model.units有一个属性checked.这是添加它的最简单方法:
component.ts:
this.model.units.forEach(item => {
item.checked = false; //change as per your requirement
});
Run Code Online (Sandbox Code Playgroud)
HTML:
<div *ngFor="let unit of model.units;let i=index">
<mat-checkbox [(ngModel)]="unit.checked" [checked]="unit.checked"
name="{{i}}-name"> //make sure name is unique for every item
</mat-checkbox>
</div>
Run Code Online (Sandbox Code Playgroud)
如果您想控制启用/禁用选项,请尝试添加以下内容:
component.ts:
this.model.units.forEach(item => {
item.checked = false;//change as per your requirement
item.disabled = true;//change as per your requirement
});
Run Code Online (Sandbox Code Playgroud)
HTML:
<div *ngFor="let unit of model.units;leti=index">
<mat-checkbox [(ngModel)]="unit.checked" [checked]="unit.checked"
[disabled]="unit.disabled"
name="{{i}}-name">//make sure name is unique for every item
</mat-checkbox>
</div>
Run Code Online (Sandbox Code Playgroud)
这项工作对我来说在Angular 7中进行了测试。
只是要确保每个复选框的名称都是唯一的
<mat-grid-list cols="4" rowHeight="100px">
<mat-grid-tile *ngFor="let item of aspNetRolesClaims" [colspan]="1" [rowspan]="1">
<span>{{item.claimValue}}</span>
<mat-checkbox [(ngModel)]="item.claimValue" name="{{item.claimType}}">{{item.claimType}}</mat-checkbox>
</mat-grid-tile>
</mat-grid-list>
Run Code Online (Sandbox Code Playgroud)
我在Angular 7中进行了测试,根据您的问题,我找不到任何错误,您可以在此StackBlitz 示例中看到一个工作演示,但这是我的答案。
为了工作,你必须name为你的 ngModel 绑定输入提供一个唯一的。
以您的代码为例:
<div *ngFor="let unit of model.units; let i=index">
<mat-checkbox
[(ngModel)]="model.units[i].checked"
id="units-{{i}}"
name="units-{{i}}" // using plain slug-case instead of array notation
>
{{ unit.name }}
</mat-checkbox>
</div>
Run Code Online (Sandbox Code Playgroud)
在这些情况下,我不喜欢使用数组表示法 ( units[{{i}}]),因为这意味着所有字段都连接在同一事物中,但由于您的代码似乎有效,这只是一种偏好,而不是错误的原因。
| 归档时间: |
|
| 查看次数: |
18690 次 |
| 最近记录: |