2014-10-20 77 views
0

我一直在使用checklist-model来处理一系列复选框,每个选中的复选框都可以删除。一切似乎都很好,直到我在ng-repeat中使用它。ng-repeat不更新跟踪模型

问题是,当我添加track by $index以及ng-repeat时,删除的复选框仍然存在。如果我删除track by,它工作正常(但在我的真实应用程序,我需要track by工作)。

这里有一个plnkr,Demo

要看到这个问题,你可以按照以下步骤。

  1. 选择任何复选框你想
  2. 删除这些选定的
  3. 检查检查所有按钮查看,

看看现在由一个与轨道,它会留下一些复选框未选中。如果您手动检查它,它会将旧值添加到列表中。这很奇怪。

任何帮助或交代会很感激,感谢

+2

为什么不用'id'跟踪 – harishr 2014-10-20 19:17:18

+0

澄清@哈里什的评论,如果它不明显,使用'ng-repeat:verb动词跟踪动词.id' – 2014-10-20 19:41:53

回答

1

如果您仍然需要跟踪的,与​​对象的id使用它。假设对象的id始终是唯一的。

将多个跟踪功能解析为同一个密钥是错误的。 (这将意味着,两个不同的对象被映射到相同的DOM元素,这是不可能的。)

因此,而不是这样的:

<tr ng-repeat="verb in verbs track by $index"> 
    <td> 
     <input type="checkbox" checklist-model="list.verbs" checklist-value="verb.id"> 
    </td> 
    <td> 
     {{verb.id}} 
    </td> 
    <td> 
     <span>{{verb.text}}</span> 
    </td> 
    </tr> 

使用这样的:

<tr ng-repeat="verb in verbs track by verb.id"> 
    <td> 
     <input type="checkbox" checklist-model="list.verbs" checklist-value="verb.id"> 
    </td> 
    <td> 
     {{verb.id}} 
    </td> 
    <td> 
     <span>{{verb.text}}</span> 
    </td> 
    </tr> 

http://plnkr.co/edit/UTtQQJIbtRPdGh0YhRMH?p=preview

+0

谢谢,不知道我们可以使用track .property可以工作,大多数例子我看到他们只使用$ index,所以我只是认为这是唯一的方法,并假设每次模型更改时它都会生成一个唯一的ID 。 – 2014-10-21 06:32:14