【问题标题】:NG-Repeat doesn't update cleanly when scope is updated更新范围时,NG-Repeat 不会干净地更新
【发布时间】:2018-09-20 21:43:29
【问题描述】:

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

<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 函数。

【问题讨论】:

  • 试试w in workspaces track by $index
  • 天哪。有时候我真的是个笨蛋。感谢 dcodesmith!将其设置为答案,我会为您标记它以获得一些分数。

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


【解决方案1】:

试试这个...

w in workspaces track by $index

当集合的内容发生变化时,ngRepeat对DOM进行相应的>变化:

  • 添加项目时,模板的新实例会添加到 DOM。
  • 当一个项目被移除时,它的模板实例也会从 DOM 中移除。
  • 重新排序项目时,它们各自的模板在 DOM 中重新排序。

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

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

例如,您可以使用特殊作用域属性 $index,通过集合中每个项目的索引来跟踪项目

【讨论】:

  • 谢谢老兄!希望这个 SO 能帮助那些真正需要帮助的人,而不是像我这样在过去 2 天里显然没有喝足够咖啡的专业人士,这给我带来了问题。大声笑!
  • 这些事情发生了,很高兴我能帮上忙;)
  • 救命!有完全相同的场景,我将 ajax 下载一个新数据集,然后炸毁一个绑定到 ng-repeat 的数组,然后将 ui 中的结果加倍,然后再向我显示正确的新结果集.我确实有一个通过 id 跟踪的跟踪,但是将其更改为 index 完全解决了这个问题,大概是因为我现在迫使 Angular 重用以前的 li 而不是创建新的。
【解决方案2】:

接受的答案对我没有帮助(使用 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>

【讨论】:

  • 谢谢!这正是奏效的。我假设无论出于何种原因,指令和组件的优先级冲突存在某种问题,但是在实施您的解决方案之后,它就像一个魅力!考虑到动画,这对我来说特别有用
猜你喜欢
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-06
  • 2016-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多