【发布时间】:2016-08-20 15:37:26
【问题描述】:
我试图通过在我的 ngRepeat 中使用“track by”以及使用一次性绑定来最小化 AngularJS 应用程序中的观察者数量。
例如
我的观点:
<div ng-repeat="item in items track by trackingId(item)">
{{ ::item.updated_at }} {{ ::item.id }}
</div>
我的 trackingId 和范围如下所示:
$scope.items = [
{ id: 1, updated_at: 'January 1, 2015' },
{ id: 2, updated_at: 'January 1, 2016' },
...
]
$scope.trackingId = function(item) {
return item.id + '_' + item.updated_at;
}
现在,在我的应用程序的某个地方,items updated_at 的值发生了变化。例如,
$scope.updateItem = function(item) {
item.updated_at = Date.now();
}
然后,我希望视图将此项目反映为 DOM 中的“新”项目,因为该项目的 trackingId 值已更改,从而更新了一次性绑定值,但这并没有发生。
我对一次性绑定+trackBy的理解不正确吗?如果我的 trackingId 发生更改,我该如何实现上述目的,该项目将在视图上重新绘制?
谢谢,
【问题讨论】:
-
我认为最优雅的方法是这里的底部答案-stackoverflow.com/questions/31271093/…
-
也许吧,但我对 trackBy 的理解不正确吗?
-
我的理解是 trackBy 是这样的,如果你想替换整个数据集,它将能够快速找到差异并只重新渲染那部分 dom。另一方面,一次绑定就是它在锡上所说的 - 如果没有某种机制来更新值,它永远不会改变。您正在更新您标记为“不要再更新我”的值,并且很惊讶它没有更新。您可以将 :: 添加到您不想再次更新的值中,并将其余部分保持正常 - codepen.io/dmoojunk/pen/grdKyo
-
好吧,难道不会更改某物的跟踪 ID,让它看起来对数据集来说是“新”的吗?那不应该更新数组并像该元素是数据集中的新项目一样行事吗?
-
您专门将其标记为'::don't watch this value'。正确更新它没有任何效果。
标签: javascript angularjs