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 ...
随机推荐
- 解决linux 无法下载 oracle 官网 java的 安装包
wget --no-cookies --no-check-certificate --header "Cookie: oraclelicense=accept-securebackup-co ...
- @UniqueConstraint
jedis UniqueConstraint定义在Table或SecondaryTable元数据里,用来指定建表时需要建唯一约束的列. 元数据属性说明: columnNames:定义一个字符串数组,指 ...
- 柯朗数(Courant number)研究
在数值计算过程中,对于计算结果的准确性和效率有很高的要求,但是这两者之间往往互相矛盾:而使用柯朗数可用于平衡两者. 1.柯朗数的定义: C = sqrt(gh)*t/s 其中,t是时间步长,s是网格在 ...
- 怎么评价Facebook的Relay框架?Meteor.js 是什么?
http://www.zhihu.com/question/34531232?rf=34500201 Meteor.js 是什么? 作者:陈天链接:http://www.zhihu.com/quest ...
- python 字符编码 转换
#!/bin/env python#-*- encoding=utf8 -*-# 文件头指定utf8编码还是乱码时,使用下面方式指定# fix encoding problem import sys ...
- solrCloud的两种部署方式
solrcloud 的部署其实有两种方式可选,那么我们在实践开发中应该怎样选择呢? 第一种:当启动solr服务器时,内嵌的启动一个Zookeeper服务器,然后将这些内嵌的Zookeeper服务器组成 ...
- jmeter性能测试小小的实战
项目描述: 被测网站:xqtesting.blog.51cto.com 指标:响应时间以及错误率 场景: 新建 一个线程组,设置线程属性: 线程数为10 Ramp-Up-Penod(in second ...
- 56992 vuser_init.c(12): Error: Socket descriptor not found.
Loadrunner 运行场景时提示" vuser_init.c(12): Error: Socket descriptor not found. Hint: the problem mi ...
- 常用前端框架Angular和React的一些认识
为什么要用AngularJs? 要了解为什么使用AngularJS首先就要接受它的思想: 首先,angularJS借助了传统MVC的架构模式(model模型 view视图 controller控制 ...
- REST 风格的api
REST即表述性状态传递,是设计风格不是标准.REST架构风格有以下6个约束: 1. 客户-服务器(Client-Server):通信只能由客户端单方面发起,表现为请求-响应形式. 2.无状态:通信的 ...