更新范围时,NG-Repeat不会干净地更新

时间:2015-04-30 15:53:09

标签: angularjs angularjs-ng-repeat ng-repeat

所以我有一个工作区列表:

<li class="workspace-object" ng-repeat="w in workspaces | filter:searchQuery" ng-click="selectWorkspace(w)">
    <a href="" class="workspace-link">{{w.name | titleCase }}</a>
</li>

该列表通过某个函数在数据库中更新,然后我调用下面的loadWorkspaces函数,重新填充$ scope.workspaces对象

$scope.loadWorkspaces = function() {
  APIService.getWorkspaces().then(function(data){
    $scope.workspaces = data;
  });
}

当发生这种情况时,$ scope.workspaces在注销时会立即读取正确的更新信息,但是,ng-repeat DUPLICATES会在更新到正确的列表之前。我不知道为什么会这样。有任何想法吗? 在此示例中,我正在更新工作区标题,该更新运行loadworkspaces函数。

issue

2 个答案:

答案 0 :(得分:5)

试试这个......

w in workspaces track by $index
  

当集合的内容发生变化时,ngRepeat会生成相应的&gt;更改DOM:

     
      
  • 添加项目时,会将新模板实例添加到DOM中。
  •   
  • 删除项目后,将从DOM中删除其模板实例。
  •   
  • 重新排序项目时,各自的模板将在DOM中重新排序。
  •   
     

默认情况下,ngRepeat不允许在数组中使用重复项。这是因为当存在重复项时,不可能在集合项和DOM元素之间保持一对一的映射。

     

如果您确实需要重复重复项目,则可以使用跟踪表达式替换默认跟踪行为。

     

例如,您可以使用特殊范围属性$ index

按集合中每个项目的索引跟踪项目。

答案 1 :(得分:0)

接受的答案对我没有帮助(使用Angular 1.1.10),我的重复仍然在延迟更新。在努力工作之前,我已经奋斗了很久。

而不是像这样重复我的自定义指令;

<my-directive ng-repeat="item in myarray track by item.id" some-binding="item"></my-directive>

在将ng-repeat移至(非指令)父元素之后,我(神奇地)使其工作了,就像这样:

<div ng-repeat="item in myarray track by item.id">
    <my-directive some-binding="item"></my-directive>
</div>