? ? angular中指令大致可以理解為一種組件,它具有dom元素,也具有自身的事件處理,還可以與外部其他進(jìn)行通信。下面我們說一下整個(gè)指令的構(gòu)成。
? ?name可選的參數(shù),指令的名稱。priority優(yōu)先級,在dom中包含多個(gè)指令的時(shí)候,優(yōu)先級的高低是在compile函數(shù)執(zhí)行之前的排序,高優(yōu)先級則先編譯執(zhí)行,但是相同優(yōu)先級并沒有規(guī)定先后。teminal終端,如果設(shè)置為true那么將會(huì)在dom的指令集合中最后被執(zhí)行。template字符串或著函數(shù)返回一個(gè)構(gòu)成dom的字符串。replace設(shè)置為true后template將會(huì)替代掉自定義的標(biāo)簽。templateUrl返回一個(gè)代表html段,transclude大致理解為將指令包裹的元素放到指令模版的特定位置。
? ?scope代表指令的作用域,設(shè)置為false代表繼承父作用域,跟隨父親的值改變;設(shè)置為true表示繼承父作用域并且創(chuàng)建自己的作用域,跟隨父親的值改變但是自己的改變不影響父親的值;設(shè)置為對象的時(shí)候,表示創(chuàng)建一個(gè)獨(dú)立的隔離的作用域,父作用域的值與子作用域的值互不影響,但是可以通過相關(guān)策略去訪問父作用域的值:@字符串單向綁定父作用域的值,=字符串雙向綁定父作用域的值,&函數(shù)名綁定父作用域的方法。
? ?controller可以是字符串也可以是個(gè)函數(shù),字符串的時(shí)候?qū)⒆址鳛榭刂破鞯拿?,如果是個(gè)函數(shù),需要注意一些特殊的服務(wù),$scope與指令元素相關(guān)聯(lián)的作用域,$element當(dāng)前指令對應(yīng)的元素,$attrs當(dāng)前元素屬性組成的對象,$transclude嵌入鏈接函數(shù),實(shí)際被執(zhí)行用來克隆或者操作dom中的函數(shù)。指令的控制器和link函數(shù)可以進(jìn)行互換,區(qū)別在于,控制器主要用來提供可在指令間復(fù)用的行為,可對外提供與外部交互的接口,link只能在當(dāng)前指令內(nèi)定義行為。controllerAs作為controller別名。
? ?require字符串或者數(shù)組,字符串代表另一個(gè)指令的名字,require的參數(shù)值,沒有前綴會(huì)在自身提供的控制器中查找,如果找不到控制器則報(bào)錯(cuò),前綴?在當(dāng)前指令中查找如果沒有找到則返回null給link,前綴^如果當(dāng)前指令沒有找到控制器就會(huì)查找父元素的控制器,前綴?^如果當(dāng)前元素和父元素查找不到控制器則返回null給link函數(shù)。
? ?compile和link,compile可以返回一個(gè)對象或者函數(shù),link負(fù)責(zé)將作用域和dom鏈接。其他的等剩下我找到別的具體的有意思的關(guān)于指令的文檔在作補(bǔ)充吧。