angular.module('myApp', []).
directive('myDirective', function () {
return {
restrict: String,
priority: Number,
terminal: Boolean,
template: String or Template Function: function (tElement, tAttrs) (...},
templateUrl: String,
replace: Boolean or String,
scope: Boolean or Object,
transclude: Boolean,
controller: String or function(scope, element, attrs, transclude, otherInjectables) { ... },
controllerAs: String,
require: String,
link: function (scope, iElement, iAttrs) { ... },
compile: // 返回一個(gè)對(duì)象或連接函數(shù)兄纺,如下所示:
function(tElement, tAttrs, transclude) {
return {
pre: function(scope, iElement, iAttrs, controller) { ... },
post: function(scope, iElement, iAttrs, controller) { ... }
}
// 或者
return function postLink(...) { ... }
}
};
});
1. scope
scope的三種取值
- false(默認(rèn)值):直接使用父scope。
- true:繼承父scope娱挨,子作用域scope的proto指向了父作用域scope
- 對(duì)象{ }:創(chuàng)建一個(gè)新的“隔離”scope删壮,但仍可與父scope通信
隔離的scope撞芍,通常用于創(chuàng)建可復(fù)用的指令方庭,也就是它不用管父scope中的model。然而雖然說是“隔離”有咨,但通常我們還是需要讓這個(gè)子scope跟父scope中的變量進(jìn)行綁定琐簇。綁定的策略有3種:@:單向綁定,外部scope能夠影響內(nèi)部scope座享,但反過來不成立=:雙向綁定婉商,外部scope和內(nèi)部scope的model能夠相互改變&:把內(nèi)部scope的函數(shù)的返回值和外部scope的任何屬性綁定起來
false(默認(rèn)值):直接使用父scope。
比較“危險(xiǎn)”征讲【菽常可以理解成指令內(nèi)部并沒有一個(gè)新的scope,它和指令以外的代碼共享同一個(gè)scope诗箍。我們創(chuàng)建的指令繼承了父作用域的一切屬性和方法癣籽,這也使得在指令的模板中我們可以使用這些屬性和方法挽唉。
因?yàn)槲覀儗cope的屬性設(shè)置為false所以,我們創(chuàng)建的指令繼承了父作用域的一切屬性和方法筷狼,這也使得在指令的模板中我們可以使用這些屬性和方法瓶籽。true:從父作用域繼承并創(chuàng)建一個(gè)新的作用域?qū)ο蟆?br> 子作用域scope的
_proto_
指向了父作用域scope
內(nèi)置指令ng-controller的作用,就是從父級(jí)作用域繼承并創(chuàng)建一個(gè)新的子作用域埂材。它會(huì)創(chuàng) 建一個(gè)新的從父作用域繼承而來的子作用域塑顺。{ }:創(chuàng)建一個(gè)新的“隔離”scope,當(dāng)我們將scope的屬性設(shè)置為{}時(shí)俏险,我們可以做更多的事情严拒。
AngularJS最強(qiáng)的大的地方之一就是它可以構(gòu)建組件,無論放在哪里都是可以使用的竖独;這所以可以做到這些裤唠,不得不歸功于指令的這個(gè)屬性;當(dāng)我們將scope設(shè)置為{}時(shí)莹痢,意味著我們創(chuàng)建的一個(gè)新的與父作用域隔離的新的作用域种蘸,這使我們?cè)诓恢劳獠凯h(huán)境的情況下,就可以正常工作竞膳,不依賴外部環(huán)境航瞭。所以隔離的scope,通常用于創(chuàng)建可復(fù)用的指令坦辟,也就是它不用管父scope中的model刊侯。
我們使用了隔離的作用域,不代表我們不可以使用父作用域的屬性和方法长窄。我們可以通過向scope的{}中傳入特殊的前綴標(biāo)識(shí)符(即prefix)滔吠,來進(jìn)行數(shù)據(jù)的綁定。在創(chuàng)建了隔離的作用域挠日,我們可以通過@,&,=引用應(yīng)用指令的元素的屬性。
綁定的策略有3種:@翰舌、=嚣潜、&
1、@ 單項(xiàng)綁定的前綴標(biāo)識(shí)符使用方法:在元素中使用屬性椅贱,好比這樣my-directive my-name="{{name}}">
注意懂算,屬性的名字要用-將兩個(gè)單詞連接,因?yàn)槭菙?shù)據(jù)的單項(xiàng)綁定所以要通過使用{{}}來綁定數(shù)據(jù)庇麦。
注意计技,父作用域中修改綁定值會(huì)影響子作用域,但子作用域修改綁定的值不影響父作用域山橄。
2垮媒、= 雙向數(shù)據(jù)綁定前綴標(biāo)識(shí)符使用方法:在元素中使用屬性,好比這樣my-directive age="age">
注意,數(shù)據(jù)的雙向綁定要通過=前綴標(biāo)識(shí)符實(shí)現(xiàn)睡雇,所以不可以使用{{}}萌衬。
3、& 綁定函數(shù)方法的前綴標(biāo)識(shí)符使用方法:在元素中使用屬性它抱,好比這樣my-directive change-my-age="changeAge()">
秕豫,
注意,屬性的名字要用-將多個(gè)個(gè)單詞連接观蓄。注意:在新創(chuàng)建指令的作用域?qū)ο笾谢煲疲褂脤傩缘拿诌M(jìn)行綁定時(shí),要使用駝峰命名標(biāo)準(zhǔn)侮穿,比如下面的代碼沫屡。