tl; dr:最初的問題是「如何觸發每個摘要循環的回調?」但潛在的問題更加有趣,既然這兩者都回答了,我繼續前進並修改了標題。 =)如何檢查摘要循環是否已穩定(又名「角度編譯完成?」)
語境:我想,當角度編譯完成後的HTML(搜索引擎優化預渲染的原因),解決所有的依賴,ngincludes,API調用後,控制等 的「最聰明」的方式到目前爲止,我發現通過檢查消化週期是否穩定。
所以我認爲如果每次觸發摘要循環並保持當前時間時運行回調,如果在任意時間間隔(2000毫秒)內沒有觸發其他循環,則可以認爲編譯已穩定並且頁面準備好歸檔爲搜索引擎優化爬蟲。
目前爲止的進展情況:我想通過觀察$ 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);
}
});
解決方案:新增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);
});
});
謝謝!我並沒有想到,我可以使用守望者作爲觸發器......像魅力一樣工作! =) –
請注意,它會爲每個$摘要觸發一次,而不是每個$ digest循環觸發一次。一個週期可以多次調用$ digest。 – tasseKATT
我知道。希望我能想出更有效率的東西......謝謝! –