如何检查摘要周期是否已稳定(又名"有角度完成编译?")

Phi*_*mas 5 javascript angularjs angularjs-digest

tl; dr:最初的问题是"如何在每个摘要周期触发回调?" 但潜在的问题更有趣,因为这回答了两个问题,我继续修改标题.=)

背景:我试图控制的角度,当编译完成后的HTML(搜索引擎优化预渲染的原因),解决所有的依赖,ngincludes,API调用等."最聪明"的方式到目前为止,我已经找到了后是通过检查是否消化周期已趋于稳定.
所以我想,如果我运行一个回调每一个消化周期触发时间,并就当前的时间,如果没有其他的周期是任意时隔(2000毫秒)内触发,我们可以认为编译稳定了,页面准备为SEO爬虫存档.

到目前为止的进展:我想看看$ rootScope.$$阶段会做但是,虽然很多交互应该触发那个观察者,但我发现它只在第一次加载时触发一次.

这是我的代码:

app.run(function ($rootScope) {
  var lastTimeout;
  var off = $rootScope.$watch('$$phase', function (newPhase) {
    if (newPhase) {
      if (lastTimeout) {
        clearTimeout(lastTimeout);
      }
      lastTimeout = setTimeout(function () {
        alert('Page stabilized!');
      }, 2000);
    }
  });
Run Code Online (Sandbox Code Playgroud)



解决方案:添加了Mr_Mig的解决方案(荣誉)以及一些改进.

app.run(function ($rootScope) {
  var lastTimeout;
  var off = $rootScope.$watch(function () {
    if (lastTimeout) {
      clearTimeout(lastTimeout);
    }
    lastTimeout = setTimeout(function() {
      off(); // comment if you want to track every digest stabilization
      // custom logic
    }, 2000);
  });
});
Run Code Online (Sandbox Code Playgroud)

小智 3

我实际上不知道我的建议是否会回答您的问题,但您可以简单地将侦听器传递给$watch将在每次迭代时调用的函数:

$rootScope.$watch(function(oldVal, newVal){
    // add some logic here which will be called on each digest cycle
});
Run Code Online (Sandbox Code Playgroud)

看看这里:http://docs.angularjs.org/api/ng/type/$rootScope.Scope#$watch