本文章已收錄於: AngularJS知識庫 AngularJS知識庫 分類: javascript(55) 分類: javascript(55) http://www.cnblogs.com/xiaoxie53/p/5058198.html 前面的文章介紹了很多angular自帶的指令,下麵我們看看 ...
本文章已收錄於: AngularJS知識庫 分類:
http://www.cnblogs.com/xiaoxie53/p/5058198.html
前面的文章介紹了很多angular自帶的指令,下麵我們看看如何使用directive自定義指令。
先看一個例子:
<body> <div my-hello></div> </body> <script type="text/javascript"> var m1 = angular.module('myApp',[]); m1.directive('myHello',function(){ return { restrict : 'A', replace : true, template : '<div>hello angular</div>' }; }); </script>
1:我們定義了一個my-hello的指令。
2:使用directive完善這個指令,返回一個對象。有三個值:
a) :restrict共四個值:E:標簽指令,C:class指令,M:註釋指令,A:屬性指令
如何使用 ?
b):replace是否替換(M註釋必須為true才能解析)看圖:
true:
false:
c):template內容,除此之外還有templateUrl,指定一個html模板文件。
下麵再舉個例子:
<div ng-controller="Aaa"> <div my-tab my-id="div1" my-name="name" my-fn="show(num)" class="J-tab"></div> <div my-tab my-id="div2" my-name="name" my-fn="show(num)" class="J-tab"></div> </div> <script type="text/javascript"> var m1 = angular.module('myApp',[]); m1.controller('Aaa',['$scope',function($scope){ $scope.name = 'xiecg'; $scope.age = 18; $scope.show = function(num){ console.log(num); }; }]); m1.directive('myTab',function(){ return { restrict : 'ECMA', replace : true, //替換的方式插入內容//綁定策略 scope : { myId : '@', //解析普通字元串 myName : '=', //解析數據 myFn : '&' //函數 }, controller : ['$scope',function($scope){ //共用數據存放在這裡 $scope.name = 'this is a xiecg'; }], template : '<div id="{{myId}}">\ <input type="button" value="1" class="active" ng-click="myFn({num:456})">\ <input type="button" value="2">\ <input type="button" value="3">\ <div style="display:block;">{{myName}}</div>\ <div>2222</div>\ <div>3333</div>\ </div>' }; }); </script>
1:scope預設是false,為true表示獨立作用域。
2:scope給予一個對象時,表示執行綁定策略,在template上調用這些數據。
a):我們在DOM元素上my-id,我們使用@符號,表示解析普通字元串,說白了就是你寫什麼就是什麼。
b):使用=符號,表示解析數據。
c):使用&符號,表示這綁定一個函數。
3:controller,表示綁定指令內部使用的數據。
好,下麵來繼續完善這個tab切換的例子!
完整代碼:
<!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Tab選項卡實例</title> <style type="text/css"> .J-tab .active{background-color:#03A9F4;} .J-tab div{display:none;} </style> <script type="text/javascript" src="js/jquery-1.11.1.js"></script> <script type="text/javascript" src="js/angular.min.js"></script> </head> <body> <div ng-controller="Aaa"> <my-tab my-id="div1" my-data="sports" class="J-tab"></my-tab> <my-tab my-id="div2" my-data="time" class="J-tab"></my-tab> </div> <script type="text/javascript"> var m1 = angular.module('myApp',[]); m1.controller('Aaa',['$scope',function($scope){ $scope.sports = [ {title : '籃球',content : '111111111'}, {title : '足球',content : '222222222'}, {title : '排球',content : '333333333'} ]; $scope.time = [ {title : '上午',content : '444444444'}, {title : '中午',content : '555555555'} ]; }]); m1.directive('myTab',function(){ return { restrict : 'E', replace : true, scope : { myId : '@', myData : '=' }, controller : ['$scope',function($scope){ $scope.name = 'this is a xiecg'; }], template : '<div id="{{myId}}">\ <input ng-repeat="data in myData" type="button" ng-value="data.title" ng-class="{active:$first}">\ <div ng-repeat="data in myData" ng-style="{display:$first?\'block\':\'none\'}">{{data.content}}</div>\ </div>', link : function(scope,element,attr){ element.on('click','input',function(){ var self = $(this) , i = self.index(); self.addClass('active').siblings('input').removeClass('active'); self.siblings('div').eq(i).show().siblings('div').hide(); }); } }; }); </script> </body> </html>
link屬性,表示當directive被angular編譯後,執行該方法。這個方法接受三個參數,
a):scope表示controller下麵的數據。
b):element表示當前的DOM元素。
c):attr表示這個DOM元素上的自定義屬性。
補充:
在實際的開發過程中我們往往需要嵌套各種組件和指令。下麵來介紹directive中的transclude和require。
<!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>自定義指令間的互相交互</title> <script type="text/javascript" src="js/angular.min.js"></script> </head> <body> <div> <hello> <hi></hi> </hello> </div> <script type="text/javascript"> var m1 = angular.module('myApp',[]); m1.directive('hello',function(){ return { restrict : 'E', replace : true, transclude : true, //允許自定義指令的嵌套,通過ng-transclude指定嵌套的範圍 controller : function($scope){ $scope.name = 'xiecg'; this.name = 'xiecg'; //使用this共用給其他指令 }, template : '<div>hello angular <h1 ng-transclude></h1></div>' }; }); m1.directive('hi',function(){ return { restrict : 'E', replace : true, require : '^hello',//hello指令屬性hi指令的父級,需要用^符號指定。如果無法指定,使用?容錯處理。 template : '<span>hi angular {{name}}</span>', link : function(scope,element,attr,reController){ console.log(reController); //得到父級hello指令中共用出來的數據 } }; }); </script> </body> </html>