angular自定义指令,意咱们能够经过angula本身定义指令,来实现咱们的特殊要求,随心所欲,一支穿云箭,千军万马来相见html
多少年的老规矩了,先看代码:app
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 6 <meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"> 7 <title>test</title> 8 </head> 9 <body ng-app="myApp"> 10 <my-title></my-title> //元素my-title 11 <div my-title></div> //属性my-title 12 <div class="my-title"></div>//类my-title 13 <!-- directive: my-title -->//注释my-title(注意必定要加directive) 14 <script src="angular.min.js"></script> 15 <script> 16 var app = angular.module("myApp", []) 17 18 app.directive("myTitle", function(){ //myTitle与上面的my-title对应, 这里要写驼峰式,上面写 - 式 19 return { 20 restrict: 'ECMA', //指令做用域,E表示做用于元素,C表示做用于类(class),M表示做用于注释,A表示做用于元素属性 21 template: '<h1>还有谁</h1>', //模板,将模板内容显示在对应区域(按照restrict显示)
22 replace: true //用模板标签替换掉注释标签,使得注释内容能在网页内显示出来 (即:设置为true能够替换标签,false只能替换文本内容) 24 } 25 }) 26 27 </script> 28 </body> 29 </html>
transclude能够将被替换掉的文本内容显示到指定位置,用法以下:测试
transclude: true; ng-transclude;配合使用ui
1 <div my-title>德莱联盟</div>
1 app.directive("myTitle", function(){ 2 return { 3 restrict: 'AM', 4 template: '<span><div ng-transclude>德莱联盟</div>德玛西亚</span>', 5 replace: true, 6 transclude: true 7 } 8 })
经过templateUrl能够用外部文本、标签替换内部文本、标签,注:要在localhost协议下测试this
app.directive("myTitle", function(){ return { restrict: 'AM', templateUrl: 'time.html' //加入外部文件url } })
如上,咱们能够经过自定义指令,来渲染页面,固然自定义指令也能够加在控制器里,这时控制器做用域做为父做用域,以下:url
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 6 <meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"> 7 <title>test</title> 8 </head> 9 <body ng-app="myApp"> 10 <my-title></my-title> 11 <div my-title></div> 12 <div class="my-title"></div> 13 <!-- directive: my-title --> 14 <div ng-controller="myCtr"> 15 <input type="text" ng-model="msg"> 16 <p my-title msg-data="{{msg}}">{{msg}}</p> 17 <h1>{{msg}}</h1> 18 </div> 19 20 <script src="angular.min.js"></script> 21 <script> 22 var app = angular.module("myApp", []) 23 .controller('myCtr', function($scope){ 24 $scope.msg = "德玛西亚"; 25 }) 26 .directive("myTitle",function(){ 27 return { 28 restrict: 'A', 29 controller: function($scope){ 30 $scope.msg = "还有谁"; 31 }, 32 scope: true //默认是false,表示其做用域和父做用域相同,当为true时表示他们有各自的做用域互不干扰 33 } 34 }) 35 36 </script> 37 </body> 38 </html>
看上面代码,不难发现angularJS支持连缀,这是由于angular的方法会返回一个对象即上面的"app",因此其能够像jQuery同样连缀spa
scope还能够是一个对象,如:scala
1 template: '<em>{{msg}}</em>', //将父做用域msg变斜体后以模板的形式加载到子做用域
2
3 scope: { 4 msg: '@msgData' //对应上面代码的msg-data,其功能是将子做用域msg指向父做用域msg,便于上一步中的模板加载操做 5 }
这样一来,子做用域的p标签也会渲染为 "德玛西亚"rest
经过上面分析,咱们发现可不能够在自定义指令中自定义方法呢?答案是可疑的,那就是link闪亮登场的时候了,个人大刀早已饥渴难耐了!!!code
代码:
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 6 <meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"> 7 <title>test</title> 8 </head> 9 <body ng-app="myApp"> 10 <div repeat-num="3">我爱中华 //自定义指令,将div重复渲染3次 11 12 </div> 13 14 <script src="angular.min.js"></script> 15 <script> 16 var app = angular.module("myApp", []); 17 18 app.directive("repeatNum", function(){ 19 return { 20 restrict: 'A', 21 link: function(m,T,bc) { //这三个参数是经过console.log(this);console.log(arguments);来查看的 22 var num = bc.repeatNum; //获取上面repeat-num的值 23 console.log(this); 24 console.log(arguments); 25 for(var i = 0; i < num; i++){ //for循环实现屡次渲染 26 var cDom = T.clone(); //克隆div 27 T.after(cDom); //将克隆好的div加在现有的div以后 28 } 29 } 30 31 } 32 }) 33 34 </script> 35 </body> 36 </html>
如上图所示link方法共有5个参数其中三个是:m、T、bc,m表示做用域,T表示自定义指令做用的元素即div,bc表示其属性
固然了咱们也能够对其子元素自定义操做,即屡次渲染等,以下代码片断:
1 <div repeat-num="3"> 2 <h1>我觉得你不会选我呢</h1> 3 </div>
app.directive("repeatNum", function(){ return { restrict: 'A', link: function(m,T,bc) { var num = bc.repeatNum; var cDom = T.children(); //找到自定义指令操做元素的子节点 for(var i = 0; i < num; i++){ T.append(cDom.clone()); //将其子元素克隆并加入父元素 } } } })
上述即为自定义指令的用法,欢迎再次光临召唤师峡谷。
女士们、先生们,today is history, today we make history, today is part of history.