概述
var
app = angular.module(
'myapp'
, []);
app.directive(
'helloWorld'
,
function
() {
return
{
restrict:
'AE'
,
replace:
'true'
,
template:
'<h3>Hello World!!</h3>'
};
});
<
hello-world
/>
//OR
<
hello:world
/>
<
div
hello-world></
div
>
//OR
<
div
hello:world/>
<div data-hello-world></div>
//OR
<div x-hello-world></div>
-
restrict – 这个属性用来指定指令在HTML中如何使用(还记得之前说的,指令的四种表示方式吗)。在上面的例子中,我们使用了 ‘AE’。所以这个指令可以被当作新的HTML元素或者属性来使用。如果要允许指令被当作class来使用,我们将 restrict 设置成 ‘AEC’。
-
template – 这个属性规定了指令被Angular编译和链接(link)后生成的HTML标记。这个属性值不一定要是简单的字符串。template 可以非常复杂,而且经常包含其他的指令,以及表达式({{ }})等。更多的情况下你可能会见到 templateUrl, 而不是 template。所以,理想情况下,你应该将模板放到一个特定的HTML文件中,然后将 templateUrl 属性指向它。
-
replace – 这个属性指明生成的HTML内容是否会替换掉定义此指令的HTML元素。在我们的例子中,我们用 <hello-world></hello-world>的方式使用我们的指令,并且将 replace 设置成 true。所以,在指令被编译之后,生成的模板内容替换掉了 <hello-world></hello-world>。最终的输出是 <h3>Hello World!!</h3>。如果你将 replace 设置成 false,也就是默认值,那么生成的模板会被插入到定义指令的元素中。
Link函数和Scope
<
body
ng-controller
=
"MainCtrl"
>
<
input
type
=
"text"
ng-model
=
"color"
placeholder
=
"Enter a color"
/>
<
hello-world
/>
</
body
>
app.directive(
'helloWorld'
,
function
() {
return
{
restrict:
'AE'
,
replace:
true
,
template:
'<p style="background-color:{{color}}">Hello World'
,
link:
function
(scope, elem, attrs) {
elem.bind(
'click'
,
function
() {
elem.css(
'background-color'
,
'white'
);
scope.$apply(
function
() {
scope.color =
"white"
;
});
});
elem.bind(
'mouseover'
,
function
() {
elem.css(
'cursor'
,
'pointer'
);
});
}
};
});
-
scope – 指令的scope。在我们的例子中,指令的scope就是父controller的scope。
-
elem – 指令的jQLite(jQuery的子集)包装DOM元素。如果你在引入AngularJS之前引入了jQuery,那么这个元素就是jQuery元素,而不是jQLite元素。由于这个元素已经被jQuery/jQLite包装了,所以我们就在进行DOM操作的时候就不需要再使用 $()来进行包装。
-
attr – 一个包含了指令所在元素的属性的标准化的参数对象。举个例子,你给一个HTML元素添加了一些属性:,那么可以在 link 函数中通过 attrs.someAttribute 来使用它。
原文链接: sitepoint 翻译: 伯乐在线 - 陈 鑫伟
译文链接: http://blog.jobbole.com/62249/