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