angular directive的简单使用总结


Posted in Javascript onMay 24, 2017

摘要

directive(指令)是angular的一个非常强大又有用的功能,它相当于实现了组件化的概念。我们可以通过它公共地自定义DOM元素或CLASS类或ATTR属性,并且在这基础上进行操作scope、绑定事件等等。将一些公共的模块或操作封装到指令中,然后就可以在html页面中编写简单的一行代码就可以加载整个公共模块,大大避免了代码的冗余。一般使用directive有以下场景:

  1. 使html更具有语义化,不需要深入研究和了解逻辑即可知道页面的大致逻辑;
  2. 抽象出一个自定义的组件,以便在其他地方可以进行复用。

下面我想通过一些实例结合分析对我所了解的directive进行一些简单的归纳总结(我所使用的是angular1.5.3):

一、Directive的使用

angular.module("app",[]).directive("directiveName",function(){
return{
//通过设置项来定义
};
})

二、一个简单的实例

html代码:

<!DOCTYPE html>
<html ng-app='helloApp'>
 <body>
  <hello></hello>
 </body>

 <script src="js/angular.min.js"></script>
 <script src="js/helloDirective.js"></script>
</html>

js代码:

var appModule = angular.module('helloApp', []);
appModule.directive('hello', function() {
 return {
  restrict: 'E',
  template: '<div>Hello,friends!</div>',
  replace: true
 };
});

效果截图:

angular directive的简单使用总结

实例解析:

1、restrict:EACM的子集的字符串,它限制directive为指定的声明方式。

  1. E - 元素名称: <my-directive></my-directive>
  2. A - 属性名:<div my-directive=”exp”></div>
  3. C - class名: <div class=”my-directive:exp;”></div>
  4. M - 注释 : <!-- directive: my-directive exp -->

2、默认情况下,directive将仅仅允许通过属性声明,ECA较常用。

template:指令显示的模板内容,一般由html标签和文本组成。通常情况下html内容较简单的情况下使用,模板内容复杂的建议将公共部分抽离到html文件中,使用templateUrl属性。

templateUrl - 与template基本一致,但模版通过指定的url进行加载。因为模版加载是异步的,所以compilation、linking都会暂停,等待加载完毕后再执行。

3、replace:如果设置为true,那么模版将会替换当前元素,而不是作为子元素添加到当前元素中。(注:为true时,模版必须有一个根节点)

上述实例dom节点截图:

angular directive的简单使用总结

三、实例2:关于transclude

修改上面实例代码:

<!DOCTYPE html>
<html ng-app='helloApp' ng-controller="myController">
 <body>
  <hello>{{myName}}</hello>
 </body>

 <script src="js/angular.min.js"></script>
 <script src="js/helloDirective.js"></script>
</html>
var appModule = angular.module('helloApp', []);
appModule.directive('hello', function() {
 return {
  restrict: 'E',
  template: '<div>Hello,my name is <span ng-transclude></span></div>',
  replace: true,
  transclude:true
 };
});

效果截图:

angular directive的简单使用总结

angular directive的简单使用总结

解析:

transclude:指令的作用是把我们自定义的语义化标签替换成浏览器能够认识的HTML标签。上述例子replace设置为true,模版将会替换当前元素。而transclude设置为true的作用可以简化地理解成:把<hello>标签替换成我们所编写的HTML模板,但是<hello>标签内部的内容保持不变。而<span ng-transclude></span>则是指明标签内部内容插入到模板内容的哪个位置。

四、实例3:关于compile,link和controller

实例代码:

phonecatDirectives.directive('exampleDirective', function() { 
 return { 
  restrict: 'E', 
  template: '<p>Hello {{number}}!</p>', 
  controller: function($scope, $element){ 
   $scope.number = $scope.number + "22222 "; 
  }, 
  link: function(scope, el, attr) { 
   scope.number = scope.number + "33333 "; 
  }, 
  compile: function(element, attributes) { 
   return { 
    pre: function preLink(scope, element, attributes) { 
     scope.number = scope.number + "44444 "; 
    }, 
    post: function postLink(scope, element, attributes) { 
     scope.number = scope.number + "55555 "; 
    } 
   }; 
  } 
 } 
}); 

//controller.js添加 
dtControllers.controller('directive2',['$scope', 
 function($scope) { 
  $scope.number = '1111'; 
 } 
]); 

//html 
<body ng-app="phonecatApp"> 
 <div ng-controller="directive2"> 
  <example-directive></example-directive> 
 </div> 
</body>

运行结果:

Hello 1111 22222 44444 55555!

由结果可以看出来,controller先运行,compile后运行,link不运行。

将上例中的compile注释掉的运行结果:

Hello 1111 22222 33333!

由结果可以看出来,controller先运行,link后运行,link和compile不兼容。

简单解析:

指令的控制器和link函数(后面会讲)可以进行互换。区别在于,控制器主要是用来提供可在指令间复用的行为但link链接函数只能在当前内部指令中定义行为,且无法再指令间复用。

更多了解可以参考Angular官方站点:https://angularjs.org/

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js调用浏览器打印模块实现点击按钮触发自定义函数
Mar 21 Javascript
dreamweaver 8实现Jquery自动提示
Dec 04 Javascript
JavaScript判断字符长度、数字、Email、电话等常用判断函数分享
Apr 01 Javascript
js实现顶部可折叠的菜单工具栏效果实例
May 09 Javascript
简单对比分析JavaScript中的apply,call与this的使用
Dec 04 Javascript
bootstrap网格系统使用方法解析
Jan 13 Javascript
JavaScript实现父子dom同时绑定两个点击事件,一个用捕获,一个用冒泡时执行顺序的方法
Mar 30 Javascript
AngularJS中的promise用法分析
May 19 Javascript
Vue 过滤器filters及基本用法
Dec 26 Javascript
分享5个小技巧让你写出更好的 JavaScript 条件语句
Oct 20 Javascript
vue路由权限校验功能的实现代码
Jun 07 Javascript
深入了解JS之作用域和闭包
Jun 16 Javascript
深入理解JavaScript 参数按值传递
May 24 #Javascript
详解Angular 4.x NgTemplateOutlet
May 24 #Javascript
javascript简单写的判断电话号码实例
May 24 #Javascript
Angular2搜索和重置按钮过场动画
May 24 #Javascript
深入理解react-router@4.0 使用和源码解析
May 23 #Javascript
angularjs中ng-bind-html的用法总结
May 23 #Javascript
vue.js实现价格格式化的方法
May 23 #Javascript
You might like
PHP 万年历实现代码
2012/10/18 PHP
php计算两个文件相对路径的方法
2015/03/14 PHP
php使用mysqli向数据库添加数据的方法
2015/03/20 PHP
php实现在线考试系统【附源码】
2018/09/18 PHP
用javascript编写的第一人称射击游戏
2007/02/25 Javascript
javascript 表单的友好用户体现
2009/01/07 Javascript
jquery easyui 对于开始时间小于结束时间的判断示例
2014/03/22 Javascript
一个可以增加和删除行的table并可编辑表格中内容
2014/06/16 Javascript
深入浅析react native es6语法
2015/12/09 Javascript
JavaScript的函数式编程基础指南
2016/03/19 Javascript
微信小程序 购物车简单实例
2016/10/24 Javascript
easyui中combotree循环获取父节点至根节点并输出路径实现方法
2016/11/10 Javascript
JS中的作用域链
2017/03/01 Javascript
JS如何判断浏览器类型和详细区分IE各版本浏览器
2017/03/04 Javascript
jQuery插件HighCharts绘制简单2D柱状图效果示例【附demo源码】
2017/03/21 jQuery
nodejs获取微信小程序带参数二维码实现代码
2017/04/12 NodeJs
在vue项目中引用Iview的方法
2018/09/14 Javascript
微信小程序BindTap快速连续点击目标页面跳转多次问题处理
2019/04/08 Javascript
深入解读Node.js中的koa源码
2019/06/17 Javascript
webpack.DefinePlugin与cross-env区别详解
2020/02/23 Javascript
[54:43]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第一场 2月22日
2021/03/11 DOTA
python检测远程服务器tcp端口的方法
2015/03/14 Python
Python3.X 线程中信号量的使用方法示例
2017/07/24 Python
python中找出numpy array数组的最值及其索引方法
2018/04/17 Python
django 在原有表格添加或删除字段的实例
2018/05/27 Python
opencv python统计及绘制直方图的方法
2019/01/21 Python
PyCharm Anaconda配置PyQt5开发环境及创建项目的教程详解
2020/03/24 Python
英国安全产品购物网站:The Safe Shop
2017/03/20 全球购物
Jeep牧马人、切诺基和自由人零配件:4 Wheel Drive Hardware
2017/07/02 全球购物
Bealls Florida百货商店:生活服饰、家居装饰和鞋子
2018/02/23 全球购物
静态变量和实例变量的区别
2015/07/07 面试题
2014小学语文教师个人工作总结
2014/12/03 职场文书
实习推荐信格式模板
2015/03/27 职场文书
音乐课《小猫钓鱼》教学反思
2016/02/18 职场文书
《进击的巨人》新联动CM 兵长强势出击兽巨人
2022/04/05 日漫
React更新渲染原理深入分析
2022/12/24 Javascript