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中的对象和数组的应用技巧
Jan 07 Javascript
js资料toString 方法
Mar 13 Javascript
javascript实现的在当前窗口中漂浮框的代码
Mar 15 Javascript
在Javascript里访问SharePoint列表数据的实现方法
May 22 Javascript
Javascript生成json的函数代码(可以用php的json_decode解码)
Jun 11 Javascript
JS和JQUERY获取页面大小,滚动条位置,元素位置(示例代码)
Dec 14 Javascript
js浮点数保留两位小数点示例代码(四舍五入)
Dec 26 Javascript
使用jquery制作弹出框效果
Apr 03 Javascript
jfreechart插件将数据展示成饼状图、柱状图和折线图
Apr 13 Javascript
用JavaScript实现页面重定向功能的教程
Jun 04 Javascript
webpack学习笔记之代码分割和按需加载的实例详解
Jul 20 Javascript
JavaScript 隐性类型转换步骤浅析
Mar 15 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下通过file_get_contents的代理使用方法
2011/02/16 PHP
PHP CURL模拟登录新浪微博抓取页面内容 基于EaglePHP框架开发
2012/01/16 PHP
PHP 将逗号、空格、回车分隔的字符串转换为数组的函数
2012/06/07 PHP
利用php下载xls文件(自己动手写的)
2014/04/18 PHP
php字符串截取函数用法分析
2014/11/25 PHP
PHP基于工厂模式实现的计算器实例
2015/07/16 PHP
PHP的APC模块实现上传进度条
2015/10/27 PHP
实例简介PHP的一些高级面向对象编程的特性
2015/11/27 PHP
php socket通信简单实现
2016/11/18 PHP
php微信分享到朋友圈、QQ、朋友、微博
2019/02/18 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
如何用javascript去掉字符串里的所有空格
2007/02/08 Javascript
JavaScript中访问节点对象的方法有哪些如何使用
2013/09/24 Javascript
javascript 按键事件(兼容各浏览器)
2013/12/20 Javascript
js和jquery分别验证单选框、复选框、下拉框
2015/12/17 Javascript
基于bootstrap的选择框插件icheck
2016/12/23 Javascript
基于node.js之调试器详解
2017/08/22 Javascript
浅谈Express异步进化史
2017/09/09 Javascript
解决微信小程序云开发中获取数据库的内容为空的方法
2019/05/15 Javascript
在vue中对数组值变化的监听与重新响应渲染操作
2020/07/17 Javascript
微信小程序实现自定义动画弹框/提示框的方法实例
2020/11/06 Javascript
[52:52]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第三局
2016/02/27 DOTA
python实现TCP服务器端与客户端的方法详解
2015/04/30 Python
使用Python对MySQL数据操作
2017/04/06 Python
Python 中字符串拼接的多种方法
2018/07/30 Python
对pandas中时间窗函数rolling的使用详解
2018/11/28 Python
django框架使用orm实现批量更新数据的方法
2019/06/21 Python
Python学习笔记之字符串和字符串方法实例详解
2019/08/22 Python
Django中的FBV和CBV用法详解
2019/09/15 Python
python中利用matplotlib读取灰度图的例子
2019/12/07 Python
tornado+celery的简单使用详解
2019/12/21 Python
Python turtle画图库&amp;&amp;画姓名实例
2020/01/19 Python
使用CSS3的box-sizing属性解决div宽高被内边距撑开的问题
2016/06/28 HTML / CSS
HTML5页面音视频在微信和app下自动播放的实现方法
2016/10/20 HTML / CSS
什么是数据库锁?Oracle中都有哪些类型的锁?
2015/08/21 面试题
使用springboot暴露oracle数据接口的问题
2021/05/07 Oracle