【问题标题】:Can I tell why Angular 1 is calling a rootScope function on every digest我能告诉我为什么 Angular 1 在每个摘要上都调用一个 rootScope 函数吗
【发布时间】:2017-02-06 22:17:09
【问题描述】:

我遇到了一个问题,我有这样的功能......

$rootScope.canNavigate = function(stateName) {
  return !stateName || Authentication.canNavigate.call(Authentication, $state.get(stateName));
};

问题是这个函数被连续调用。堆栈跟踪每次都不同,但有一个共同点,它总是来自$apply。我已经注释掉了所有正在使用这个功能的手表,它仍然在发生。有谁知道为什么会这样?我似乎无法在 plunker 中复制。

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    根据您的情况,Asiel 可能有正确的答案,但至于如何防止它,您可以按照 Asiel 的建议使用 bind once 表达式,或者,如果由于某种原因无法做到这一点,您还可以保存结果,这样您就不会每次都调用该服务。

    var canNavigateCache = {};
    
    $rootScope.canNavigate = function(stateName) {
      return !stateName
        || canNavigateCache[stateName]
        || canNavigateCache[stateName] = 
             Authentication.canNavigate.call(Authentication, $state.get(stateName));
    };
    

    这也使您能够在需要时清除缓存,只需重置缓存对象 (canNavigateCache = {})

    【讨论】:

      【解决方案2】:

      如果在您的任何 html 上调用此函数,则每次 Angular 执行 digest 循环时都会调用此函数以进行 脏检查 (请参阅 SO 上的this question 以获得有关此的某种参考)...除非您使用 bind once 表达式(请参阅syntax on this articlethis on SO

      它是从$apply调用的,因为

      $apply() 用于从外部以角度执行表达式 角度框架。 (例如来自浏览器 DOM 事件, setTimeout、XHR 或第三方库)。因为我们正在呼唤 我们需要执行适当的范围生命周期的角度框架 异常处理,执行手表。

      $apply (也)被自己的框架用于制作digest 循环。

      【讨论】:

        猜你喜欢
        • 2015-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多