一、自定义指令;
1. var app = angular.module('app',[]);
2. app.directive('directive1',['$scope',function($scope){
return {
restrict:'ECAM', // 限制,表示指令以什么形式写进页面
scope:{ // 有了这个属性,自动创建独立作用域
&(传递外部的函数)
@(单项绑定,只能读取外部传进来的指,且需是字符)
=(双向绑定,外部的值传进来也会随着指令里的操作而改变)
}
template:'<div>111111 <div ng-transclude></div> </div>'; // 模板,指令放在页面之后显示的内容,如果内容过多,建议使用外部文件,写法如下;
templateUrl:'../template/index.html'; // 使用外部模板,内容过多的情况下使用。
replace:true, // 是否替换页面中指令里的内容,如果有这个属性,模板的外层必须要套一个标签
transclude:true,//这个属性为true,那么就可以将页面中指令里的内容保留下来,需要在指令的模板里添加一个标签使用ng-transclude,使用方法见template属性;
priority:10,// 指令执行的优先级,一般不会遇到,也不会用到,了解就行
terminal:true, // 指令的权重,如果为true,那么优先级小于10的指令都不会执行,了解就行
require:'parantController', // 指向其他指令,指令间的通信,可以将其他指令传递给自己
compile:function(element,attr,transclude){ // 与link相同,二者选其一;
console.log(element); // 当前元素
console.log(element); // 当前指令的所有属性
transclude这个参数是如果指令用了这个属性,那么这个参数就代表了页面指令里的内容
},
link:function(scope,element,attr,parantController){ // 与compile相同,二者选其一;
scope就是$scope对象
element为当前元素
attr为指令的所有属性
当有require属性时,parantController其他指令的controller,与require配合
console.log(parantController.xxx); // 外面指令的this.xxx或当前controller设定的this.xxx
当前controller中定义的$scope.xxx也可以在这里使用
},
controller:function($scope, $element, $attrs){
这里面的参数其实就是link里面的参数,只是代码规范,操作元素的写进link,操作逻辑的写进controller
},
controllerAs:'tempController', // 给controller起的别名,link的第四个参数也可以用这个,指向的就是当前controller
}
}])
补充:(1) templateUrl还可以使用script模板来带入,例如:
<script type='text/ng-template' id='template1'>
<div>这里是模板的内容</div>
</script>
那么就可以写成:templateUrl:'template1'; //这里要注意,如果使用script模板必须要给id
(2)require:'^aaa',
1. 没标记。在当前元素中查找,如果找不到就抛出错误。
2. ?标记。在当前元素中查找,如果查找不到,不抛出错误,链接函数的第四个参数为null(如上面代码link: function (scope, elem, attrs, d1)中的d1)
3. ^标记。不仅在当前元素中查找,还查找其所有父级。如果找不到就抛出错误。
4. ^^标记。只在当前元素的父级中查找。如果找不到就抛出错误。
5. ?^标记。不仅在当前元素中查找,还查找其所有父级。如果查找不到,不抛出错误,链接函数的第四个参数为null
6. ?^^标记。只在当前元素的父级中查找。如果查找不到,不抛出错误,链接函数的第四个参数为null
(3) 如果directive直接return function(){}而不是一个{}对象,那么function就是link
二、angularjs 指令编译的三个阶段
1. 标准浏览器API转化
将html转化成dom,所以自定义的html标签必须符合html的格式
2. Angular compile
搜索匹配directive,按照priority排序,并执行directive上的compile方法
3. Angular link
执行directive上的link方法,进行scope绑定及事件绑定