【问题标题】:Is AngularJs digest cycle triggered after any function call?任何函数调用后都会触发 AngularJs 摘要循环吗?
【发布时间】:2015-12-22 16:09:06
【问题描述】:

我有一个指令,它在链接阶段定义了一个函数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>

我在实践中得到的是一个无限循环,导致上述函数被重复调用。 经过一些研究,我发现这通常发生在被调用函数隐式或显式触发摘要循环时(例如,如果它使用 $http 服务)。但在这种情况下,该功能实际上什么都不做。是否有可能在其他地方触发了摘要循环,或者我错过了什么? 顺便说一句,我知道会有更好的方法来达到相同的结果,我只是好奇这里的工作原理。

【问题讨论】:

  • 你能发布你的指令吗?
  • 如果您使用没有侦听器的$watch,您将知道何时出现任何$digest。
  • @dfsq 对不起,我不能。这是我公司的代码。让我补充一些细节。
  • @raina77ow 但是,如果它不再绑定到范围,我怎么能从模板中调用函数呢?
  • 完全同意。实际上这不是我的代码;)奇怪的是,虽然该函数不是一次调用,而是在第一次调用后无限次调用。

标签: javascript angularjs angularjs-digest


【解决方案1】:

没有看到实际的代码(我知道你不能发布确切的代码,因为它是为你的工作准备的)我只能猜测。但我认为正在发生的事情是您正在通过返回 $scope. innerBarStyle 来调整元素的样式,这会触发调用摘要循环的 ng-style 指令,从而再次触发范围函数。因此,这个逻辑的持续执行。

为了解决这个问题,您可能应该在指令的 elem 上使用 angular.element API 来调整 CSS。

【讨论】:

    猜你喜欢
    • 2016-05-20
    • 2017-05-09
    • 2015-06-11
    • 2015-08-22
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 2012-08-02
    相关资源
    最近更新 更多