在編譯階段,AngularJS將遍歷整個HTML文檔,並根據JavaScript中的指令定義處理頁面上聲明的指令。
每條指令的模板可能包含另壹條指令,而另壹條指令可能有自己的模板。AngularJS調用HTML文檔根處的指令時,會遍歷其中的所有模板,模板中也可能包含帶模板的指令。
模板樹可能很大很深,但是需要註意的是,雖然元素可以由多個指令支持或修飾,並且這些指令的模板本身也可以包含其他指令,但是只有屬於最高優先級指令的模板才會被解析並添加到模板樹中。這裏有個建議,就是把包含模板的指令和添加行為的指令分開。如果壹個元素已經有壹個包含模板的指令,千萬不要用另壹個指令來修飾它。只有優先級最高的指令中的模板才會被編譯。
壹旦指令及其子模板被遍歷或編譯,編譯後的模板將返回壹個名為template function的函數。我們有機會在指令的模板函數返回之前修改編譯好的DOM樹。此時,DOM樹還沒有被數據綁定,這意味著如果此時操作DOM樹,性能開銷將很小。基於此,ng-repeat、ng-transclude等內置指令會在此時,也就是綁定到任何作用域數據之前,對DOM進行操作。
互連
使用link函數創建可以操作DOM的指令。鏈接功能是可選的。如果定義了編譯函數,它將返回鏈接函數,因此當兩個函數都定義時,編譯函數將重載鏈接函數。如果我們的指令很簡單,不需要額外的設置,我們可以從工廠函數(回調函數)返回壹個函數,而不是對象。如果是,這個函數就是壹個鏈接函數。