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中调用WebService方法小结
Mar 28 Javascript
js将当前时间格式转换成时间搓(自写)
Sep 26 Javascript
js与运算符和或运算符的妙用
Feb 14 Javascript
24款热门实用的jQuery插件推荐
Dec 24 Javascript
JS实现同一个网页布局滑动门和TAB选项卡实例
Sep 23 Javascript
jQuery选择器基础入门教程
May 10 Javascript
vue Render中slots的使用的实例代码
Jul 19 Javascript
使用vue与jquery实时监听用户输入状态的操作代码
Sep 19 jQuery
js实现QQ面板拖拽效果(慕课网DOM事件探秘)(全)
Sep 19 Javascript
React diff算法的实现示例
Apr 20 Javascript
vue打包静态资源后显示空白及static文件路径报错的解决
Sep 02 Javascript
一百多行代码实现react拖拽hooks
Mar 23 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
一个MYSQL操作类
2006/11/16 PHP
PHP 常见郁闷问题答解
2006/11/25 PHP
PHP 数组实例说明
2008/08/18 PHP
PHP教程 基本语法
2009/10/23 PHP
php INI配置文件的解析实现分析
2011/01/04 PHP
PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用
2012/05/07 PHP
php使用pdo连接报错Connection failed SQLSTATE的解决方法
2014/12/15 PHP
简单谈谈php浮点数精确运算
2016/03/10 PHP
PHP中include/require/include_once/require_once使用心得
2016/08/28 PHP
javascript在事件监听方面的兼容性小结
2010/04/07 Javascript
JavaScript包装对象使用介绍
2013/08/29 Javascript
如何获取网站icon有哪些可行的方法
2014/06/05 Javascript
jquery实现textarea 高度自适应
2015/03/11 Javascript
javascript实现可全选、反选及删除表格的方法
2015/05/15 Javascript
jquery中checkbox使用方法简单实例演示
2015/11/24 Javascript
ztree获取选中节点时不能进入可视区域出现BUG如何解决
2015/12/03 Javascript
基于JavaScript实现跳转提示页面
2016/09/24 Javascript
javascript 正则表达式分组、断言详解
2017/04/20 Javascript
Angularjs 实现动态添加控件功能
2017/05/25 Javascript
JS组件系列之Gojs组件 前端图形化插件之利器
2017/11/29 Javascript
关于AngularJS中几种Providers的区别总结
2020/05/17 Javascript
vue使用exif获取图片经纬度的示例代码
2020/12/11 Vue.js
Vue使用鼠标在Canvas上绘制矩形
2020/12/24 Vue.js
[01:01:51]EG vs VG Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
Python用5行代码写一个自定义简单二维码
2018/10/21 Python
python3 selenium自动化测试 强大的CSS定位方法
2019/08/23 Python
python编写简单端口扫描器
2019/09/04 Python
给我一面国旗 python帮你实现
2019/09/30 Python
Python如何实现大型数组运算(使用NumPy)
2020/07/24 Python
自定义html标记替换html5新增元素
2008/10/17 HTML / CSS
英国剑桥包中文官网:The Cambridge Satchel Company中国
2018/11/06 全球购物
文员自我评价怎么写
2013/09/19 职场文书
个人主要事迹材料
2014/08/26 职场文书
搞笑欢迎词大全
2015/09/30 职场文书
MySQL中使用or、in与union all在查询命令下的效率对比
2021/05/26 MySQL
python运算符之与用户交互
2022/04/13 Python