AngularJS的脏检查循环是否在任何函数调用后被触发?

4
我有一个指令,它在链接阶段定义了innerBarStyle()函数并将其绑定到作用域:
restrict : 'EA',
scope: {
  values: '='             
},
link: function(scope, elements, attributes){
  scope.innerBarStyle = function(value){
    console.count("innerBarStyleCounter");
    return {
        width: 10px;
    };
  }),
templateUrl: 'template.html'
};

该函数仅计算其被执行的次数并返回一个对象。
现在,在模板指令的模板中,我通过表达式调用此函数。类似于 <div ... ng-style=innerBarStyle(someValueInCurrentScope)><div>
实际上,我得到了一个无限循环,导致反复调用上述函数。经过一些研究,我发现通常会发生这种情况,当调用的函数隐式或显式地触发digest周期时(例如,如果它使用$http服务)。但是在这种情况下,该函数确实什么都没有做。可能在其他地方触发了digest周期,还是我错过了什么?顺便说一下,我知道有更好的方法来实现相同的结果,我只是好奇这里的工作原理。

你能发布你的指令吗? - dfsq
1
如果您使用没有监听器的 $watch,则会在任何 $digest 发生时得到通知。 - pgrodrigues
@dfsq 抱歉,我不能这样做。这是我的公司的代码。让我补充一些细节。 - Luca Poddigue
@raina77ow,那么如果函数不再绑定到作用域中,我该如何从模板中调用它? - Luca Poddigue
完全同意。其实这不是我的代码;) 奇怪的是,该函数在第一次调用后会无限调用。 - Luca Poddigue
对于未来的读者,您也可以在这里查看答案:https://dev59.com/RWAg5IYBdhLWcg3wjbhu - user203687
1个回答

1
没有看到实际的代码(我知道你不能发布确切的代码,因为它是为你的工作而做的),我只能猜测。但我认为正在发生的是,您通过$scope. innerBarStyle的返回来调整元素的样式,这会触发ng-style指令,从而调用摘要周期,进而再次触发作用域函数。因此,这个逻辑不断地执行。
为了解决这个问题,您应该使用指令的elem上的angular.element API来调整CSS。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接