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 相关文章推荐
javawscript 三级菜单的实现原理
Jul 01 Javascript
基于jquery ajax 用户无刷新登录方法详解
Apr 28 Javascript
wap浏览自动跳转到wap页面的js代码
May 17 Javascript
20个实用的JavaScript技巧分享
Nov 28 Javascript
Bootstrap carousel轮转图的使用实例详解
May 17 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
Aug 13 Javascript
Javascript 创建类并动态添加属性及方法的简单实现
Oct 20 Javascript
微信开发 JS-SDK 6.0.2 经常遇到问题总结
Dec 08 Javascript
Vue.js常用指令的使用小结
Jun 23 Javascript
Node.js使用Koa搭建 基础项目
Jan 08 Javascript
不刷新网页就能链接新的js文件方法总结
Mar 01 Javascript
js中实现继承的五种方法
Jan 25 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
php桌面中心(二) 数据库写入
2007/03/11 PHP
APACHE的AcceptPathInfo指令使用介绍
2013/01/18 PHP
PHP中数组定义的几种方法
2013/09/01 PHP
php删除数组元素示例分享
2014/02/17 PHP
PHP伪静态Rewrite设置之APACHE篇
2014/07/30 PHP
php创建session的方法实例详解
2015/01/27 PHP
解读PHP中的垃圾回收机制
2015/08/10 PHP
通过js获取div的background-image属性
2013/10/15 Javascript
JS函数的定义与调用方法推荐
2016/05/12 Javascript
Bootstrap 源代码分析(未完待续)
2016/08/17 Javascript
JS实现页面数据无限加载
2016/09/13 Javascript
JavaScript中发出HTTP请求最常用的方法
2018/07/12 Javascript
js实现京东秒杀倒计时功能
2019/01/21 Javascript
react国际化化插件react-i18n-auto使用详解
2020/03/31 Javascript
深入分析jQuery.one() 函数
2020/06/03 jQuery
vue2.0 解决抽取公用js的问题
2020/07/31 Javascript
Python语言编写电脑时间自动同步小工具
2013/03/08 Python
python使用PyGame模块播放声音的方法
2015/05/20 Python
python Pandas 读取txt表格的实例
2018/04/29 Python
python开发游戏的前期准备
2019/05/05 Python
Python使用sklearn实现的各种回归算法示例
2019/07/04 Python
python base64库给用户名或密码加密的流程
2020/01/02 Python
配置python的编程环境之Anaconda + VSCode的教程
2020/03/29 Python
Kenneth Cole官网:纽约时尚优雅品牌
2016/11/14 全球购物
HSRP的含义以及如何工作
2014/09/10 面试题
网友共享的几个面试题关于Java和Unix等方面的
2016/09/08 面试题
手术室护士自我鉴定
2013/10/14 职场文书
大二学生职业生涯规划书
2014/02/05 职场文书
计生工作先进事迹
2014/08/15 职场文书
工程承包协议书范本
2014/09/29 职场文书
思想纪律作风整顿剖析材料
2014/10/11 职场文书
教师节班会开场白
2015/06/01 职场文书
三八妇女节主持词
2015/07/04 职场文书
python通过函数名调用函数的几种方法总结
2021/06/07 Python
python字符串的多行输出的实例详解
2021/06/08 Python
基于JavaScript实现省市联动效果
2021/06/22 Javascript