angularjs的ngRepeat指令不会触发列表中其他项的digest
angularjs ngRepeat directive to not trigger digest for other items in the list
似乎ngRepeat在更改其中一项后会触发任何列表项上的手表。我已经在使用track by了,所以这似乎没有帮助。
这是我的模板:
div(ng-repeat="poll in polls track by poll._id")
poll(poll="poll")
.poll
.title(ng-if="!poll.closed") {{poll.title}}
.btn(ng-click="poll.closed = true") Change poll
{{someExpensiveComputation(poll._id)}}
javascript: .directive('poll', function($rootScope, $modal) {
return {
replace: false,
restrict: 'E',
scope: {
poll: '='
},
templateUrl: '/tmpl/poll',
link: function($scope, elem, attrs) {
$scope.someExpensiveComputation = function (id) { ... }
}
}
});
似乎无论何时更改投票项,someexpensivcompute函数都会为所有投票运行,每次运行3次。我怎么才能让它不那样呢?它应该只会触发该指令的监视者。我认为这应该是可能的。
谢谢。
所有watch-表达式在每次$digest循环中被处理(求值)多次。
因此,保持watch-表达式尽可能简单(就计算复杂性而言)是一个很好的做法。
(顺便说一句,在视图中使用{{...}}
会创建一个手表)
如果someExpensiveComputation()
在计算上很昂贵,您不希望每次都计算它,而只希望在可能产生不同结果时才计算它。这取决于函数的实现,但是假设它的结果只依赖于每个轮询的属性,那么您可以观察轮询,并在它被更改时调用昂贵的函数:
.poll
...
{{expensivelyComputedValue}}
.directive('poll', function($rootScope, $modal) {
return {
...
link: function(scope, elem, attrs) {
function someExpensiveComputation(id) { ... }
scope.expensivelyComputedValue = someExpensiveComputation(scope.poll.id);
scope.$watch('poll', function (newValue, oldValue) {
if (newValue === oldValue) { return; }
scope.expensivelyComputedValue = someExpensiveComputation(scope.poll.id);
}, true);
}
}
});
当然,如果昂贵的计算结果仅取决于poll的特定属性(而不是整个对象),则只监视这个属性就足够了,从而使watch-表达式更加"轻量级"。例如:scope.$watch('poll.closed', function (...) {...});
相关文章:
- 如何在 *ngFor 列表中显示单击的元素,使用 Angular 2 隐藏其他元素
- 从下拉列表中选择其他选项时激活文本框
- 单击列表中的引导输入按钮将禁用其他按钮
- 如何使用其他下拉列表中未选择的选项填充下拉列表
- 我创建了一个下拉列表,以及如何显示所选项目的其他列数据
- 在选择其他下拉列表html和javascript araray的基础上,填充3个连续的下拉列表
- 如何在使用任何其他数据库的同时,用javascript获取所有mongo数据库的列表
- 将列表项设置为负顶部的动画会使其他列表项下降
- React Redux将项目添加到列表中会转移到其他创建的列表中
- 使用AngularJS中的ngOptions隐藏其他列表中的选定选项
- 如何在从所有下拉列表中选择一个时禁用其他下拉列表
- 选择列表框以更改其他输入
- JQuery文本编辑器-在工具栏中添加其他下拉列表
- 如何根据其他下拉列表中的选择筛选下拉结果
- Sharepoint SPService从其他列表中获取ListItem
- 如何将其附加到其他页面上的选择下拉列表中
- jQuery 根据其他下拉列表的选定值禁用其他下拉列表值
- 在任一下拉列表中选择“其他”时,两个下拉菜单将打开一个文本框
- 删除除使用 jQuery 单击的列表项之外的所有其他列表项
- 如何更改 HTML 数据列表输入上显示的图标?隐藏是可能的,但我可以将其更改为其他一些图标,例如向下箭头