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 相关文章推荐
改进:论坛UBB代码自动插入方式
Dec 22 Javascript
javascript生成/解析dom的CDATA类型的字段的代码
Apr 22 Javascript
js+JQuery返回顶部功能如何实现
Dec 03 Javascript
JavaScript中的关键字&quot;VAR&quot;使用详解 分享
Jul 31 Javascript
js 事件截取enter按键页面提交事件示例代码
Mar 04 Javascript
js中this用法实例详解
May 05 Javascript
JavaScript中var关键字的使用详解
Aug 14 Javascript
JS中的三个循环小结
Jun 20 Javascript
input输入框内容实时监测(附代码)
Aug 15 Javascript
anime.js 实现带有描边动画效果的复选框(推荐)
Dec 24 Javascript
在vue项目中使用md5加密的方法
Sep 14 Javascript
详解解决小程序中webview页面多层history返回问题
Aug 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生成数组再传给js的方法
2014/08/07 PHP
php+ajax实现仿百度查询下拉内容功能示例
2017/10/20 PHP
PHP7 echo和print语句实例用法
2019/02/15 PHP
JS的递增/递减运算符和带操作的赋值运算符的等价式
2007/12/08 Javascript
JQuery 常用方法基础教程
2009/02/06 Javascript
如何判断Javascript对象是否存在的简单实例
2016/05/18 Javascript
javascript事件冒泡简单示例
2016/06/20 Javascript
JS图片等比例缩放方法完整示例
2016/08/03 Javascript
jQuery 生成svg矢量二维码
2016/08/09 Javascript
Vue组件BootPage实现简单的分页功能
2016/09/12 Javascript
Bootstrap基本样式学习笔记之图片(6)
2016/12/07 Javascript
jquery ui sortable拖拽后保存位置
2017/04/27 jQuery
javascript简单链式调用案例分析
2017/05/10 Javascript
jQuery实现checkbox即点即改批量删除及中间遇到的坑
2017/11/11 jQuery
微信web端后退强制刷新功能的实现代码
2018/03/04 Javascript
node+express框架中连接使用mysql(经验总结)
2018/11/10 Javascript
Vue+Element UI+Lumen实现通用表格分页功能
2019/02/02 Javascript
跟老齐学Python之永远强大的函数
2014/09/14 Python
Python从MP3文件获取id3的方法
2015/06/15 Python
详细介绍Python进度条tqdm的使用
2019/07/31 Python
python检测服务器端口代码实例
2019/08/31 Python
python pycharm最新版本激活码(永久有效)附python安装教程
2020/09/18 Python
Python 一行代码能实现丧心病狂的功能
2020/01/18 Python
python2.7使用scapy发送syn实例
2020/05/05 Python
Python xml、字典、json、类四种数据类型如何实现互相转换
2020/05/27 Python
CSS3实现瀑布流布局与无限加载图片相册的实例代码
2016/12/22 HTML / CSS
详解HTML5 Canvas绘制不规则图形时的非零环绕原则
2016/03/21 HTML / CSS
到底Java是如何传递参数的?是by value或by reference?
2012/07/13 面试题
毕业生个人的求职信范文
2013/12/03 职场文书
个人整改措施落实情况汇报
2014/10/29 职场文书
党员示范岗材料
2014/12/19 职场文书
2015年出纳年终工作总结
2015/05/14 职场文书
热血教师观后感
2015/06/10 职场文书
雷锋的故事观后感
2015/06/10 职场文书
新娘婚礼答谢词
2015/09/29 职场文书
2016年入党心得体会范文
2016/01/23 职场文书