复选框ngFor Angular2上的双向绑定

时间:2017-06-06 11:03:36

标签: angular events checkbox two-way-binding

我正在创建一个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'   对象]'

为什么会这样,以及如何解决它?谢谢

1 个答案:

答案 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(默认情况下类成员被设置为只读),或者方式有问题您是手动将值映射到类实例。