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 相关文章推荐
如何让动态插入的javascript脚本代码跑起来。
Jan 09 Javascript
jQuery(非HTML5)可编辑表格实现代码
Dec 11 Javascript
关于延迟加载JavaScript
May 05 Javascript
javascript日期比较方法实例分析
Jun 17 Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
Sep 04 Javascript
AngularJS出现$http异步后台无法获取请求参数问题的解决方法
Nov 03 Javascript
node文字生成图片的示例代码
Oct 26 Javascript
基于vue实现网站前台的权限管理(前后端分离实践)
Jan 13 Javascript
Vue中的methods、watch、computed的区别
Nov 26 Javascript
浅谈Vue CLI 3结合Lerna进行UI框架设计
Apr 14 Javascript
vue-cli的build的文件夹下没有dev-server.js文件配置mock数据的方法
Apr 17 Javascript
angular6开发steps步骤条组件
Jul 04 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
改造一台复古桌面收音机
2021/03/02 无线电
mysql 字段类型说明
2007/04/27 PHP
解析CodeIgniter自定义配置文件
2013/06/18 PHP
如何使用纯PHP实现定时器任务(Timer)
2015/07/31 PHP
深入浅析PHP无限极分类的案例教程
2016/05/09 PHP
Smarty变量用法详解
2016/05/11 PHP
PHP构造函数与析构函数用法示例
2016/09/28 PHP
PHPMailer使用QQ邮箱实现邮件发送功能
2017/08/18 PHP
textarea的value是html文件源代码,存成html文件的代码
2007/04/20 Javascript
JavaScript 学习历程和心得分享
2010/12/12 Javascript
用JavaScript实现用一个DIV来包装文本元素节点
2014/09/09 Javascript
JavaScript中的console.log()函数详细介绍
2014/12/29 Javascript
JS实现table表格数据排序功能(可支持动态数据+分页效果)
2016/05/26 Javascript
angularjs ocLazyLoad分步加载js文件实例
2017/01/17 Javascript
Angular2+国际化方案(ngx-translate)的示例代码
2017/08/23 Javascript
微信小程序使用picker实现时间和日期选择框功能【附源码下载】
2017/12/11 Javascript
Vuex 入门教程
2018/01/10 Javascript
手把手教你用Node.js爬虫爬取网站数据的方法
2018/07/05 Javascript
TypeScript中使用getElementXXX()的示例代码
2019/09/12 Javascript
浅谈Vue3 Composition API如何替换Vue Mixins
2020/04/29 Javascript
[01:03:41]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第三场 2月2日
2021/03/11 DOTA
在Python中操作列表之List.pop()方法的使用
2015/05/21 Python
python使用matplotlib绘制折线图教程
2017/02/08 Python
Python3.5迭代器与生成器用法实例分析
2019/04/30 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
2019/05/10 Python
python批量将excel内容进行翻译写入功能
2019/10/10 Python
妙用itchat! python实现久坐提醒功能
2019/11/25 Python
python中如何进行连乘计算
2020/05/28 Python
Jacadi Paris美国官方网站:法国童装品牌
2017/10/15 全球购物
.NET初级开发工程师面试题
2014/04/18 面试题
财务会计自荐信范文
2014/02/21 职场文书
护理专科毕业自荐信范文
2014/04/21 职场文书
预备党员转正材料
2014/12/19 职场文书
新郎父亲婚礼致辞
2015/07/27 职场文书
css display table 自适应高度、宽度问题的解决
2021/05/07 HTML / CSS
instantclient客户端 连接oracle数据库
2022/04/26 Oracle