AngularJs自定义指令详解(8) - priority
priority
默认值为0.
当一个元素上声明两个指令,而且它们的priority一样,谁先被调用?这个需要分情况讲。下面先给个例子:
<!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 app = angular.module("app", []);
app.directive('d1',function() {
return{
link: function (scope) {
scope.greeting += 'World ';
}
};
}).directive('d2',function() {
return{ link: function (scope) {
scope.greeting += 'AngularJs ';
}
};
});
</script>
</head>
<body ng-app="app">
<div ng-init="greeting='Hello '" d1 d2>{{greeting}}!</div>
</body>
</html>
输出:
Hello AngularJs World !
可见ng-init先行一步,把greeting赋值为'Hello ',然后是指令d2的链接函数,最后是d1
试一下,修改DOM中声明的次序:
<div d2 d1 ng-init="greeting='Hello '">{{greeting}}!</div>
没用,输出不变。
再试一下,修改JavaScript中声明的次序:
app.directive('d2',function() {
return{
link: function (scope) {
scope.greeting += 'World ';
}
};
}).directive('d1',function() {
return{
link: function (scope) {
scope.greeting += 'AngularJs ';
}
};
});
这下变了!输出为:
Hello World AngularJs !
魂淡,AngularJs居然使用字母顺序来确定链接函数谁先被调用!不信?试试把d1改名为e1,输出就会变回:
Hello AngularJs World !
这时候我们不得不使用priority了!否则代码没法看了:
<!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 app = angular.module("app", []);
app.directive('d1',function() {
return{
link: function (scope) {
scope.greeting += 'World ';
}
};
});
app.directive('d2',function() {
return{
priority:1,
link: function (scope) {
scope.greeting += 'AngularJs ';
}
};
});
</script>
</head>
<body ng-app="app">
<div d1 d2 ng-init="greeting='Hello '">{{greeting}}!</div>
</body>
</html>
输出:
Hello World AngularJs !
奇怪的是d2的优先级更高,为什么还是先调用了d1的链接函数?
原来我们书写链接函数的方式是一个简略方式,实际上是一个postLink:
link: function postLink( ... ) { ... }
详细的写法是这样的:
link: {
pre: function preLink(scope, iElement, iAttrs, controller) { ... },
post: function postLink(scope, iElement, iAttrs, controller) { ... }
}
preLink的执行次序是由高(优先级)至低(优先级)。
postLink的执行次序是由低至高。
验证一下:
<!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 app = angular.module("app", []);
app.directive('d1',function() {
return{
link: {
pre: function (scope) {
scope.greeting += 'World ';
}
}
};
});
app.directive('d2',function() {
return{
priority:1,
link: {
pre: function (scope) {
scope.greeting += 'AngularJs ';
}
}
};
});
</script>
</head>
<body ng-app="app">
<div d1 d2 ng-init="greeting='Hello '">{{greeting}}!</div>
</body>
</html>
输出:
Hello AngularJs World !
至于何为postLink和preLink以及它们的区别在哪,后面再说。
下面看看有模板输出的情况:
<!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 app = angular.module("app", []);
app.directive('d1',function() {
return{
priority:1,
template:'World'
};
});
app.directive('d2',function() {
return{
priority:0,
template:'AngularJs'
};
});
</script>
</head>
<body ng-app="app">
<div d1 d2></div>
</body>
</html>
以上代码,d1、d2都有模板,而因为d1的优先级更高,所以最终显示的是World,而d2的模板被完全无视了。
可以改一下d2的优先级为2,试试输出是否改变。
AngularJs自定义指令详解(8) - priority的更多相关文章
- AngularJs自定义指令详解(1) - restrict
下面所有例子都使用angular-1.3.16.下载地址:http://cdn.bootcss.com/angular.js/1.3.16/angular.min.js 既然AngularJs快要发布 ...
- AngularJs自定义指令详解(6) - controller、require
在前面文章中提到一旦声明了require,则链接函数具有第四个参数:controller. 可见require和controller是配合使用的. 在自定义指令中使用controller,目的往往是要 ...
- AngularJs自定义指令详解(10) - 执行次序
代码: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8 ...
- AngularJs自定义指令详解(2) - template
一些用于定义行为的指令,可能不需要使用template参数. 当指定template参数时,其值可以是一个字符串,表示一段HTML文本,也可以是一个函数,这函数接受两个参数:tElement和tAtt ...
- AngularJs自定义指令详解(9) - terminal
例子: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8 ...
- AngularJs自定义指令详解(5) - link
在指令中操作DOM,我们需要link参数,这参数要求声明一个函数,称之为链接函数. 写法: link: function(scope, element, attrs) { // 在这里操作DOM} 如 ...
- AngularJs自定义指令详解(7) - multiElement
multiElement不太常用,从下面这个例子可以大致看出它的作用: <!DOCTYPE html> <html> <head lang="en"& ...
- AngularJs自定义指令详解(3) - scope
我们之所以要定义指令,目的是重用指令.假设有这么一个应用场景:在同一个html里使用了两次my-directive,第一个my-directive要展示的是Hello World,第二个my-dire ...
- AngularJs自定义指令详解(4) - transclude
transclude默认值为false,如果设置 transclude为true,那么相应地,必须在模板代码中加入ng-transclude指令. 先看个例子: <!DOCTYPE html&g ...
随机推荐
- css内容样式属性
设置元素的最大高度.最小高度.最大宽度.最小宽度,用max-height.min-height.max-width.min-width. visibility:设置元素是否可见.visible和hid ...
- AC 设置DMZ口上网
- 有WebService的项目中写applicationContex.xml文件时应注意!!!
这是一个简单的WebService实例,来看下如下的applicationContex.xml文件: 1.有XFire的配置 <bean id="baseWebService" ...
- <读书笔记> 代码整洁之道
概述 1.本文档的内容主要来源于书籍<代码整洁之道>作者Robert C.Martin,属于读书笔记. 2.软件质量,不仅依赖于架构和项目管理,而且与代码质量紧密相关,本书提出一 ...
- 使用Windows上的Eclipse 远程调试 linux下的Tomcat
1:修改Linux上Tomcat的catalina.sh,第一行添加declare -x CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_sock ...
- Nginx内置变量以及日志格式变量参数详解
$args #请求中的参数值 $query_string #同 $args $arg_NAME #GET请求中NAME的值 $is_args #如果请求中有参数,值为"?",否则为 ...
- android中dx、dp、dip、sp单位的区别
1.dp=dip 2.px基于像素,后两者基于像素密度. 3.px既可用于宽度高度,也可用于字体,dp用于宽高,sp用于字体4.android中以320*480屏幕为基准.在相同值的px和dp,在32 ...
- (转)IC验证概述
验证是确保设计和预定的设计期望一致的过程,设计期望通常是通过设计规范来定义的.对于芯片设计,在不同的阶段可以分为:寄存器传输级(RTL)的功能验证.门级的仿真验证.形式验证以及时序验证.我们通常所说的 ...
- 如何使用Javascript判断浏览器终端设备
WEB开发中如何通过Javascript来判断终端为PC.IOS(iphone).Android呢? 可以通过判断浏览器的userAgent,用正则来判断手机是否是ios和Android客户端 var ...
- cf 733f
给你很多条边,每条边有一个初始边权w1,然后还有一个值表示把这个边权减一的代价w2,然后给你一个预算budget,然后让你输出怎么选边之后构成的树的边权和最小(在用budget减少了边权之后),输出你 ...