1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <script src="../lib/angular-1.3.16/angular.min.js"></script> 6 <script src=""></script> 7 <title></title> 8 <script language="JavaScript"> 9 var count = 0; 10 var logText=function(text){ 11 count++; 12 console.log(count+','+text); 13 }; 14 angular.module("app", []) 15 .controller("mainController", function ($scope) { 16 $scope.logText = logText; 17 logText('控制器初始化。'); 18 }).directive('d',function() { 19 logText('指令初始化。'); 20 return{ 21 link: { 22 pre: function () { 23 logText('preLink函數執行。'); 24 }, 25 post: function () { 26 logText('postLink函數執行。'); 27 } 28 }, 29 controller:function(){ 30 logText('內部控制器初始化。'); 31 }, 32 template:'{{logText("模板表達式執行。")}}' 33 34 }; 35 }); 36 </script> 37 </head> 38 <body ng-app="app"> 39 <div ng-controller="mainController"> 40 <div d></div> 41 <div d></div> 42 </div> 43 </body> 44 </html>
控制台:
從控制台可以看出,指令初始化甚至比控制器還早。難道說指令一旦定義,就算不在DOM中使用也會初始化?我們刪掉DOM中的
<div d></div>
<div d></div>
代碼,再看控制台,發現指令並不初始化。所以推測不對。
注意我們使用了兩次d指令,但是指令的初始化只運行了一次。這個要特別小心。
另外指令內部的控制器初始化比鏈接函數更早執行,此后就是執行preLink和postLink。一個指令把這些執行完畢,才輪到下一個指令。
模板里的表達式居然執行了6次之多,也就是說使用一次指令就要執行3次表達式,這個在性能上需要多加考慮。
以下代碼加入了編譯函數(compile並不常用,不需要深入了解)
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <script src="../lib/angular-1.3.16/angular.min.js"></script> <script src=""></script> <title></title> <script language="JavaScript"> var count = 0; var logText=function(text){ count++; console.log(count+','+text); }; angular.module("app", []) .controller("mainController", function ($scope) { $scope.logText = logText; logText('控制器初始化。'); }).directive('d',function() { logText('指令初始化。'); return{ compile: function(){ logText('編譯函數執行。'); return{ pre: function () { logText('preLink函數執行。'); }, post: function () { logText('postLink函數執行。'); } }; }, controller:function(){ logText('內部控制器初始化。'); } }; }); </script> </head> <body ng-app="app"> <div ng-controller="mainController"> <div d></div> <div d></div> </div> </body> </html>
控制台輸出:
可以看出編譯函數比控制器更早執行,但是跟指令的初始化不同,使用兩次指令就需要運行兩次編譯函數。
上面例子在使用指令時,元素是並列的。
那么,一個元素使用兩個指令,或兩個指令嵌套使用,會怎么樣呢?
看代碼:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <script src="../lib/angular-1.3.16/angular.min.js"></script> <script src=""></script> <title></title> <script language="JavaScript"> var count = 0; var logText=function(text){ count++; console.log(count+','+text); }; angular.module("app", []) .controller("mainController", function ($scope) { $scope.logText = logText; logText('mainController控制器初始化。'); }).directive('d1',function() { logText('d1 指令初始化。'); return{ priority:1, compile: function(){ logText('d1 編譯函數執行。'); return{ pre: function () { logText('d1 preLink函數執行。'); }, post: function () { logText('d1 postLink函數執行。'); } }; }, controller:function(){ logText('d1 內部控制器初始化。'); } }; }).directive('d2',function() { logText('d2 指令初始化。'); return{ compile: function(){ logText('d2 編譯函數執行。'); return{ pre: function () { logText('d2 preLink函數執行。'); }, post: function () { logText('d2 postLink函數執行。'); } }; }, controller:function(){ logText('d2 內部控制器初始化。'); } }; }); </script> </head> <body ng-app="app"> <div ng-controller="mainController"> <div d1 d2></div> </div> </body> </html>
以上代碼定義d1指令和d2指令,且它們在同一個元素上使用。注意d1的優先級更高。
關於優先級的問題,可回頭看文章http://www.cnblogs.com/sagacite/p/4622092.html
控制台輸出:
可以發現跟並列元素不同,在同一個元素上使用兩個指令,其內部控制器初始化、preLink函數和postLink函數分組執行,而不是先執行完一個指令的,再執行下一個指令的。
更換指令的使用次序:<div d2 d1></div>
可以發現這時d2指令先初始化,但是其他函數的執行次序都不變。
修改DOM的代碼如下:
<div d1><div d2></div></div>
再看控制台:
可以發現d2指令的初始化延遲到d1編譯函數執行之后了。內部控制器的初始化次序也發生了變化。