Angularjs 自定义指令directive详解

一、自定义指令;

	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绑定及事件绑定

猜你喜欢

转载自blog.csdn.net/weixin_43996999/article/details/94735583