Angular 2 ng在index + 2处错误地更改值

时间:2017-09-13 15:36:44

标签: angular ngfor ngmodel

我有一个角形的表格。该表单由一个具有多个选项的ngFor组成。

<div *ngFor="let item of items; let i = index">
  <select name="" id="" [(ngModel)]="items[i]">
    <option *ngFor="let option of options" [value]="option.value">{{option.display}}</option>
  </select>
</div>

此示例的数据:

options = Array(10).fill(1).map((option,index) => {
    return {
      display:'thing' + index,
      value: index
    };
  });
  items = [2,7,2,7,2,7,2,7];

奇怪的是,当我改变第二个选择时,第四个选择将反映相同的变化。但是该模型不会反映这种变化。

出于什么原因,视图将在匹配之后更改输入2索引。更奇怪的是,这只会在第一次发生,然后它会表现出你的预期。

以下是看到问题的傻瓜: http://plnkr.co/edit/q1YnoPBFdBKm0JDMVk7Q?p=preview

这会导致什么?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

@yurzui有正确的答案trackBy可以防止任何不必要的突变。以下是包含trackBy的代码:

<div *ngFor="let item of items; let i = index; trackBy: trackByFn">
  <select name="" id="" [(ngModel)]="items[i]">
    <option *ngFor="let option of options" [value]="option.value">{{option.display}}</option>
  </select>
</div>

trackBy取一个函数很重要,这是我解决这个问题的一个错误:

trackByFn(i: number) {
    return i;
  }

@yurzui的工作示例提供程序:

https://plnkr.co/edit/TAbQFqa3NeBvQ3FpKYCP?p=preview