【问题标题】:One-time binding with ng-repeat trackBy isn't updating与 ng-repeat trackBy 的一次性绑定未更新
【发布时间】: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


【解决方案1】:

当您更新附加到范围的项目时,您必须让 Angular 知道绑定已更改,并使用 $scope.$apply() 来做到这一点。

 $scope.updateItem = function(item) {
  item.updated_at = Date.now();
  $scope.$apply();
}

【讨论】:

  • 我仍然不明白这如何回答我的问题
【解决方案2】:

也许这不是个好主意

return item.id + '_' + item.updated_at;

尝试不使用 this。例如仅使用 id

【讨论】:

  • 您能举个例子解释一下吗?我希望 DOM 反映项目的新“updated_at”值,即使我使用的是单绑定。返回 ID 对更新视图有何帮助?
  • 如果使用bindOne,就不会再重绘了。 (没看到)
猜你喜欢
  • 1970-01-01
  • 2018-10-01
  • 2014-07-17
  • 1970-01-01
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多