2015-07-13 60 views
5

下面是用於測試指令,一個很常見的通用方案:

var element,scope; 

beforeEach(inject(function ($rootScope,$compile) { 
    scope = $rootScope.$new() 
    element = angular.element('<div my-directive></div>') 
    $compile(element)(scope) 
    scope.$digest(); //why? 
})) 

我明白$compile(element)返回拍攝功能一個範圍參數並將其提供給元素的指令。我也明白scope.$digest()執行摘要循環並開始髒檢查。儘管如此,我的問題是爲什麼你必須在致電$compile之後致電scope.$digest以使這一切都能正常工作?

回答

9

這是測試指令的通用代碼。 $Compile將模板與範圍綁定並執行link函數和$digest/$apply刷新可能已由link修改的模型的綁定。
當您在ng-click處理程序或控制器函數中調用$compile時,整個執行過程在$digest循環內運行。 Angular的構建方式是動態添加項目(執行此循環時)在同一個循環中執行。這就是爲什麼你實際上沒有注意到這些差異,並且在編譯之後沒有意識到需要進行綁定評估。然而,單元測試的方式有所不同,您應該在角度上手動執行$digest週期。例如,這在測試$q承諾時經常會導致問題。