Angular的自定义指令以及实例


Posted in Javascript onDecember 26, 2016

前面的文章介绍了很多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:属性指令

如何使用 ?

Angular的自定义指令以及实例

   b):replace是否替换(M注释必须为true才能解析)看图:

true:Angular的自定义指令以及实例

false:Angular的自定义指令以及实例

     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,表示绑定指令内部使用的数据。

Angular的自定义指令以及实例

好,下面来继续完善这个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>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
js中for in的用法示例解析
Dec 25 Javascript
Jquery Ajax方法传值到action的方法
May 11 Javascript
如何让浏览器支持jquery ajax load 前进、后退功能
Jun 12 Javascript
JavaScript的jQuery库插件的简要开发指南
Aug 12 Javascript
继续学习javascript闭包
Dec 03 Javascript
jQuery中的Deferred和promise 的区别
Apr 03 Javascript
微信小程序开发(二)图片上传+服务端接收详解
Jan 11 Javascript
EasyUI为Numberbox添加blur事件的方法
Mar 05 Javascript
详解自定义ajax支持跨域组件封装
Feb 08 Javascript
angularjs中$http异步上传Excel文件方法
Feb 23 Javascript
小程序如何使用分包加载的实现方法
May 22 Javascript
node省市区三级数据性能测评实例分析
Nov 06 Javascript
如何提高javascript加载速度
Dec 26 #Javascript
JS实现一次性弹窗的方法【刷新后不弹出】
Dec 26 #Javascript
javascript实现去除HTML标签的方法
Dec 26 #Javascript
解析JavaScript实现DDoS攻击原理与保护措施
Dec 26 #Javascript
JS实现密码框的显示密码和隐藏密码功能示例
Dec 26 #Javascript
原生JS下拉加载插件分享
Dec 26 #Javascript
jQuery实现的checkbox级联选择下拉菜单效果示例
Dec 26 #Javascript
You might like
德劲1103二次变频版的打磨
2021/03/02 无线电
利用php-cli和任务计划实现订单同步功能的方法
2017/05/03 PHP
PHP实现网站访问量计数器
2017/10/27 PHP
laravel利用中间件防止未登录用户直接访问后台的方法
2019/09/30 PHP
innerText和innerHTML 一些问题分析
2009/05/18 Javascript
javascript仿qq界面的折叠菜单实现代码
2012/12/12 Javascript
jquery scrollTop方法根据滚动像素显示隐藏顶部导航条
2013/05/27 Javascript
Javascript实现的常用算法(如冒泡、快速、鸽巢、奇偶等)
2014/04/29 Javascript
javascript表格的渲染组件
2015/07/03 Javascript
jQuery实现点击后标记当前菜单位置(背景高亮菜单)效果
2015/08/22 Javascript
编写高性能Javascript代码的N条建议
2015/10/12 Javascript
JavaScript 浏览器兼容性总结及常用浏览器兼容性分析
2016/03/30 Javascript
JavaScript中日期函数的相关操作知识
2016/08/03 Javascript
JavaScript浏览器对象模型BOM(BrowserObjectModel)实例详解
2016/11/29 Javascript
jQuery实现的checkbox级联选择下拉菜单效果示例
2016/12/26 Javascript
jQuery插件ContextMenu自定义图标
2017/03/15 Javascript
r.js来合并压缩css文件的示例
2018/04/26 Javascript
Layer+Echarts构建弹出层折线图的方法
2019/09/25 Javascript
原生JS与CSS实现软件卸载对话框功能
2019/12/05 Javascript
vue-cli3单页构建大型项目方案
2020/04/07 Javascript
解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突问题
2020/07/24 Javascript
[54:51]Ti4 冒泡赛第二轮LGD vs C9 3
2014/07/14 DOTA
巧用Python装饰器 免去调用父类构造函数的麻烦
2012/05/18 Python
Python实现类的创建与使用方法示例
2017/07/25 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
2019/06/18 Python
Python模拟伯努利试验和二项分布代码实例
2020/05/27 Python
利用python实现平稳时间序列的建模方式
2020/06/03 Python
Python 保存加载mat格式文件的示例代码
2020/08/04 Python
Superdry极度干燥美国官网:英国制造的服装品牌
2018/11/13 全球购物
成教毕业生自我鉴定
2013/10/23 职场文书
五型班组建设方案
2014/02/10 职场文书
公司年会主持词
2014/03/22 职场文书
保护环境倡议书100字
2014/05/19 职场文书
学生会竞选演讲稿纪检部
2014/08/25 职场文书
Android中的Launch Mode详情
2022/06/05 Java/Android
TS 类型兼容教程示例详解
2022/09/23 Javascript