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 相关文章推荐
JQuery与Ajax常用代码实现对比
Oct 03 Javascript
javascript搜索框效果实现方法
May 14 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
Feb 10 Javascript
Angular实现一个简单的多选复选框的弹出框指令实例
Apr 25 Javascript
获取当前按钮或者html的ID名称实例(推荐)
Jun 23 Javascript
jQuery Datatables表头不对齐的解决办法
Nov 27 jQuery
Vue前端开发规范整理(推荐)
Apr 23 Javascript
vue系列之requireJs中引入vue-router的方法
Jul 18 Javascript
图解javascript作用域链
May 27 Javascript
JS实现数组删除指定元素功能示例
Jun 05 Javascript
基于vue、react实现倒计时效果
Aug 26 Javascript
VUE+elementui组件在table-cell单元格中绘制微型echarts图
Apr 20 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安全配置方法
2007/06/16 PHP
防止用户利用PHP代码DOS造成用光网络带宽
2011/03/01 PHP
thinkphp缓存技术详解
2014/12/09 PHP
php实现在服务器端调整图片大小的方法
2015/06/16 PHP
PHP Try-catch 语句使用技巧
2016/02/28 PHP
学习ExtJS accordion布局
2009/10/08 Javascript
js 禁用只读文本框获得焦点时的退格键
2010/04/25 Javascript
js当一个变量为函数时 应该注意的一点细节小结
2011/12/29 Javascript
Javasipt:操作radio标签详解
2013/12/30 Javascript
jQuery on()方法使用技巧详解
2015/04/16 Javascript
jQuery获取当前点击的对象元素(实现代码)
2016/05/19 Javascript
详解js中的apply与call的用法
2016/07/30 Javascript
微信公众号-获取用户信息(网页授权获取)实现步骤
2016/10/21 Javascript
nodejs acl的用户权限管理详解
2018/03/14 NodeJs
解决layer.prompt无效的问题
2019/09/24 Javascript
jquery轻量级数字动画插件countUp.js使用详解
2019/10/17 jQuery
ant design中upload组件上传大文件,显示进度条进度的实例
2020/10/29 Javascript
python获取文件版本信息、公司名和产品名的方法
2014/10/05 Python
python实现搜索本地文件信息写入文件的方法
2016/02/22 Python
Python中防止sql注入的方法详解
2017/02/25 Python
Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例
2017/08/18 Python
python dataframe astype 字段类型转换方法
2018/04/11 Python
python中csv文件的若干读写方法小结
2018/07/04 Python
Django实现表单验证
2018/09/08 Python
使用python将图片按标签分入不同文件夹的方法
2018/12/08 Python
Python代码打开本地.mp4格式文件的方法
2019/01/03 Python
python实现一个猜拳游戏
2020/04/05 Python
django orm模块中的 is_delete用法
2020/05/20 Python
python实现简单贪吃蛇游戏
2020/09/29 Python
html5/css3响应式页面开发总结
2018/10/16 HTML / CSS
工程总经理工作职责
2013/12/09 职场文书
建筑设计学生的自我评价
2014/01/16 职场文书
2014年党务公开工作总结
2014/12/09 职场文书
淮海战役观后感
2015/06/11 职场文书
个人催款函范文
2015/06/24 职场文书
python和C/C++混合编程之使用ctypes调用 C/C++的dll
2022/04/29 Python