5

tl;dr:最初的问题是“如何在每个摘要周期触发回调?” 但潜在的问题要有趣得多,因为这两个都回答了,所以我继续修改了标题。=)

上下文:我试图控制 Angular 何时完成编译 HTML(出于 SEO 预渲染原因),在解决其所有依赖项、ngincludes、API 调用等之后。到目前为止,我发现的“最聪明”的方法是通过检查是否消化周期已经稳定。
所以我想,如果我每次触发摘要循环时都运行一个回调并保持当前时间,如果在任意间隔(2000ms)内没有触发其他循环,我们可以认为编译已经稳定并且页面是准备好为 SEO 爬虫存档。

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

这是我的代码:

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);
    }
  });



解决方案:添加了 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);
  });
});
4

1 回答 1

3

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

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

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

于 2014-02-26T14:43:26.620 回答