我正在创建一个Angular2项目,并且对于一个复选框有双向绑定问题。
我有一个名为listItem的类,List就是这样:
export class ListItem {
public count: number;
public value: string;
public checked: boolean;
constructor(count: number, value: string, checked: boolean) {
this.count = count;
this.value = value;
this.checked = checked;
}
}
export class MyList{
public category: string;
public listItem : ListItem [];
constructor(category: string, listItem : ListItem []) {
this.category = category;
this.listItem = listItem ;
}
}
我正在从Azure搜索中调用正常工作的列表。 问题是当我将值设置为复选框时。
<div *ngFor="let list of myList; let listIndex = index;">
<div *ngFor="let item of list.listItems; let itemIndex = index;">
<input type="checkbox" [name]="list.category + item.value"
(change)="item.checked = !item.checked"
[ngModel]="item.checked" />
</div
</div>
但是onClick上的值总是为false。我试图使用[(ngModel)]但也没有用。 我也尝试过一个函数:
(change)="oncheck(listIndex, itemIndex)"
oncheck(listIndex: number, itemIndex: number) {
this.myList[listIndex].listItems[itemIndex].checked =
!this.myList[listIndex].listItems[itemIndex].checked;
}
但我收到了这个错误:
无法分配对象'[object]的只读属性'checked' 对象]'
为什么会这样,以及如何解决它?谢谢
答案 0 :(得分:3)
您可以使用material2 md-checkbox指令创建样式元素。 在我看来,这不是真正的双向绑定,它只是两个方向的单向绑定的组合(模板 - 数据源和数据源 - 模板)
更新: 我创建了一个小plnkr来重现你的情况:http://plnkr.co/edit/cr7TokiqSaBGli7mgCBM
@Component({
selector: 'my-app',
template: `
<div *ngFor="let element of elements; let i = index;">
<span>Val: {{element}}</span>
<input type="checkbox"
[checked]="element" (change)="handleChange(element, i)">
</div>
`,
})
export class App {
elements= [
false,
true,
false,
]:
handleChange(val: boolean, index: number){
console.log("Index: "+index);
console.log("Val: "+val);
this.elements[index] = !val;
}
列表中的元素已正确呈现,但更改事件在某些情况下会修改elements数组中不正确位置的值。我会稍后再看看
更新:重构的plnkr
请检查: http://plnkr.co/edit/Ich0g5kzSiQINZjh3VYo
我对你发给我的那个人进行了一些修改。
我将迭代变量从const更改为let(考虑到它们的值在执行循环期间不是恒定的)。
正如我之前提到的,很可能有2个可能性:.ts中的类正以错误的方式转换为.js(默认情况下类成员被设置为只读),或者方式有问题您是手动将值映射到类实例。