我需要在Angular应用中更新一个小数字“时钟”。 我在我的控制器中使用以下代码:
$scope.time = new Date();
var interval = $timeout(function updateTime() {
console.log("Update time");
$scope.time = new Date();
$scope.formattedTimeValue = WBUtils.formattedTime($scope.time);
interval = $timeout(updateTime, 1000);
}, 1000);
我使用formattedTimeValue
表达式在html中的一个小div中显示{{formattedTimeValue}}
。
我还有一个ng-repeat指令使用过滤器格式化数据。我的问题是那些过滤器每秒都会被重新评估。我不明白为什么。我已将间隔功能更改为以下内容,但仍会重新评估过滤器:
var interval = $timeout(function updateTime() {
console.log("Update time");
interval = $timeout(updateTime, 1000);
}, 1000);
有人可以向我解释为什么我的过滤器会在ng-repeat中每秒对每个对象(未更改)进行评估。过滤器目前看起来像这样:
module.filter('formatLogRecord', function () {
return function (log) {
console.log("Filtering");
return "";
}
});
答案 0 :(得分:1)
角度$ timeout服务包括为整个$ rootScope(https://github.com/angular/angular.js/blob/v1.2.0rc1/src/ng/timeout.js#L10)调用$apply
,这将导致新的摘要并重新评估过滤器。如果这不是您想要的,只需使用普通的js setTimeout,并在$scope.$apply
中仅包含处理范围的位。
答案 1 :(得分:1)
首先,$ timeout在计时器达到0时导致$ scope。$ digest(),重新计算绑定。其次,每次迭代时间都会改变$ scope.time和$ scope.formattedTimeValue的值,这两个值都会导致Angular运行摘要并重新评估你的值。