2014-02-26 12 views
5

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

回答

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

+0

謝謝!我並沒有想到,我可以使用守望者作爲觸發器......像魅力一樣工作! =) –

+1

請注意,它會爲每個$摘要觸發一次,而不是每個$ digest循環觸發一次。一個週期可以多次調用$ digest。 – tasseKATT

+0

我知道。希望我能想出更有效率的東西......謝謝! –

相關問題