1

我正在使用 ng-style 在我的一个指令中传递样式。

像这样:

<my-component ng-style="test()" ng-model="message"></my-component>

和指令:

myModule.directive('myComponent', function(mySharedService) {
    return {
        restrict: 'E',
        controller: function($scope, $attrs, mySharedService) {
            $scope.test = function(){
                console.log(1)
            };
            $scope.$on('handleBroadcast', function() {
                $scope.message = 'Directive: ' + mySharedService.message;
            });
        },
        replace: true,
        template: '<input>'
    };
});

JSFIDDLE 记录 2 次 '1'

为什么test函数被调用了 2 次?

4

2 回答 2

6

一次获取值,再次查看它是否已更改。这就是手表的工作方式,每个应用摘要周期都会处理手表!这意味着每个应用摘要周期至少调用一次监视表达式,最多调用 10 次,这是 Angular 团队强制执行的硬性限制。或许这张图能说明一点!从观察列表返回到评估队列的箭头是相关位。

于 2013-08-25T17:48:29.267 回答
3

只是为了详细说明 stevuu 的答案——Angular 做了一个摘要“循环”,它将是多个同步的摘要,直到它得到一个没有任何改变的空操作。我认为只要有任何变化,至少需要两次迭代。当没有任何改变时,这将是一次迭代。虽然它可能是几次迭代。考虑一下:

控制器 A:

$rootScope.$watch('a', function(val) {
   $rootScope.b = val + 1;
}

控制器 B:

$rootScope.$watch('b', function(val) {
   $rootScope.c = val + 1;
}

控制器 C:

$rootScope.$watch('c', function(val) {
   $rootScope.d = val + 1;
}

现在如果你做一个$scope.$apply(function() { $rootScope.a = 5; })

最终结果应该是 a == 5, b == 6, c == 7 和 d == 8。除非您不知道 $watches 的运行顺序,否则它是不确定的。所以它可能需要四次传球才能达到最终状态。并且每个“pass”都会调用您应用中定义的每个 $watch。

于 2013-08-25T18:06:03.577 回答