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 相关文章推荐
由JavaScript中call()方法引发的对面向对象继承机制call的思考
Sep 12 Javascript
使用js实现的简单拖拽效果
Mar 18 Javascript
JavaScript获得页面base标签中url的方法
Apr 03 Javascript
JavaScript实现表格快速变色效果代码
Aug 19 Javascript
js判断图片加载完成后获取图片实际宽高的方法
Feb 25 Javascript
Javascript中的对象和原型(二)
Aug 12 Javascript
jQuery 插件实现随机自由弹跳气泡样式
Jan 12 Javascript
利用jQuery解析获取JSON数据
Apr 08 jQuery
详解vue-cli开发环境跨域问题解决方案
Jun 06 Javascript
javaScript封装的各种写法
Aug 14 Javascript
详解vue项目打包步骤
Mar 29 Javascript
vue 实现Web端的定位功能 获取经纬度
Aug 08 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查询mysql大量数据造成内存不足的解决方法
2015/03/04 PHP
WordPress开发中短代码的实现及相关函数使用技巧
2016/01/05 PHP
one.php 多项目、函数库、类库 统一为一个版本的方法
2020/08/24 PHP
找到一点可怜的关于dojo资料,谢谢作者!
2006/12/06 Javascript
改进:论坛UBB代码自动插入方式
2006/12/22 Javascript
js保存当前路径(cookies记录)
2010/12/14 Javascript
jQuery之过滤元素操作小结
2013/11/30 Javascript
js如何判断用户是否是用微信浏览器
2014/06/05 Javascript
javascript几个易错点记录
2014/11/26 Javascript
jQuery中appendTo()方法用法实例
2015/01/08 Javascript
JS给超链接加确认对话框的方法
2015/02/24 Javascript
在Python中使用glob模块查找文件路径的方法
2015/06/17 Javascript
DIV随滚动条滚动而滚动的实现代码【推荐】
2016/04/12 Javascript
NodeJS基础API搭建服务器详细过程记录
2017/04/01 NodeJs
如何将HTML字符转换为DOM节点并动态添加到文档中详解
2018/08/19 Javascript
vue利用全局导航守卫作登录后跳转到未登录前指定页面的实例代码
2020/05/19 Javascript
python入门教程之识别验证码
2017/03/04 Python
TensorFlow安装及jupyter notebook配置方法
2017/09/08 Python
Python pyinotify日志监控系统处理日志的方法
2018/03/08 Python
详解【python】str与json类型转换
2019/04/29 Python
python增加图像对比度的方法
2019/07/12 Python
python-序列解包(对可迭代元素的快速取值方法)
2019/08/24 Python
PyCharm2020最新激活码+激活码补丁(亲测最新版PyCharm2020.2激活成功)
2020/11/25 Python
python中实现词云图的示例
2020/12/19 Python
html+js 实现markdown编辑器效果
2019/10/23 HTML / CSS
印度在线购买电子产品网站:Croma
2020/01/02 全球购物
一些高难度的SQL面试题
2016/11/29 面试题
什么是虚拟内存?虚拟内存有什么优势?
2016/02/09 面试题
优秀中专生推荐信
2013/11/17 职场文书
实习生体会的自我评价范文
2013/11/28 职场文书
JAVA程序员自荐书
2014/01/30 职场文书
《伯牙绝弦》教学反思
2014/03/02 职场文书
小学生爱国演讲稿
2014/04/25 职场文书
美化环境标语
2014/06/20 职场文书
项目申请汇报材料
2014/08/16 职场文书
CSS极坐标的实例代码
2021/06/03 HTML / CSS