1

我需要在我的 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 "";
    }
});
4

2 回答 2

1

角度 $timeout 服务包括调用$apply整个 $rootScope ( https://github.com/angular/angular.js/blob/v1.2.0rc1/src/ng/timeout.js#L10 ),这将导致新的摘要并重新评估过滤器。如果这不是您想要的,只需使用普通的 js setTimeout 代替,并仅将处理范围的位包装在您$scope.$apply自己中。

于 2013-09-04T15:07:20.493 回答
1

首先,当计时器达到 0 时,$timeout 会导致 $scope.$digest() 重新评估绑定。其次,每次你迭代你的时间时,你都会改变 $scope.time 和 $scope.formattedTimeValue 的值,这两者都会导致 Angular 运行摘要并重新评估你的值。

于 2013-09-04T15:11:41.110 回答