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 返回布尔值Is()条件判断方法代码
May 14 Javascript
怎么选择Javascript框架(Javascript Framework)
Nov 22 Javascript
jQuery判断元素是否存在的可靠方法
May 06 Javascript
jQuery滚动条插件nanoscroller使用指南
Apr 21 Javascript
简单实现限制uploadify上传个数
Nov 16 Javascript
js基于cookie方式记住返回页面用法示例
May 27 Javascript
Vuejs第十篇之vuejs父子组件通信
Sep 06 Javascript
基于Node.js + WebSocket打造即时聊天程序嗨聊
Nov 29 Javascript
重新理解JavaScript的六种继承方式
Mar 24 Javascript
express框架实现基于Websocket建立的简易聊天室
Aug 10 Javascript
vue 自定义提示框(Toast)组件的实现代码
Aug 17 Javascript
简单了解JavaScript异步
May 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
php简单smarty入门程序实例
2015/06/11 PHP
php封装好的人民币数值转中文大写类
2015/12/20 PHP
对PHP依赖注入的理解实例分析
2016/10/09 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
2016/11/03 PHP
Windows 下安装 swoole 图文教程(php)
2017/06/05 PHP
tp5 实现列表数据根据状态排序
2019/10/18 PHP
thinkphp5.1 框架钩子和行为用法实例分析
2020/05/25 PHP
通过PHP实现用户注册后邮箱验证激活
2020/11/10 PHP
js下判断 iframe 是否加载完成的完美方法
2010/10/26 Javascript
获取当前点击按钮的id用this.id实现
2014/03/17 Javascript
jQuery使用andSelf()来包含之前的选择集
2014/05/19 Javascript
jQuery固定浮动侧边栏实现思路及代码
2014/09/28 Javascript
JavaScript实现拖拽网页内元素的方法
2015/04/15 Javascript
js实现简洁的TAB滑动门效果代码
2015/09/06 Javascript
js调用百度地图及调用百度地图的搜索功能
2015/09/07 Javascript
基于JQuery实现仿网易邮箱全屏动感滚动插件fullPage
2015/09/20 Javascript
jQuery+PHP实现微信转盘抽奖功能的方法
2016/05/25 Javascript
Ajax异步文件上传与NodeJS express服务端处理
2017/04/01 NodeJs
从零开始学习Node.js系列教程之设置HTTP头的方法示例
2017/04/13 Javascript
jQuery为某个div加入行样式
2017/06/09 jQuery
React Native中TabBarIOS的简单使用方法示例
2017/10/13 Javascript
Angular中sweetalert弹框的基本使用教程
2018/07/22 Javascript
JavaScript事件对象深入详解
2018/12/30 Javascript
JavaScript键盘事件常见用法实例分析
2019/01/03 Javascript
利用Vue的v-for和v-bind实现列表颜色切换
2020/07/17 Javascript
centos6.7安装python2.7.11的具体方法
2017/01/16 Python
Python开发虚拟环境使用virtualenvwrapper的搭建步骤教程图解
2018/09/19 Python
使用Python进行目录的对比方法
2018/11/01 Python
对Python3+gdal 读取tiff格式数据的实例讲解
2018/12/04 Python
Python使用post及get方式提交数据的实例
2019/01/24 Python
Python 模拟动态产生字母验证码图片功能
2019/12/24 Python
Pytorch中的VGG实现修改最后一层FC
2020/01/15 Python
浅谈Python协程
2020/06/17 Python
医学生自我鉴定范文
2013/11/08 职场文书
家长对老师的评语
2014/04/18 职场文书
浅谈Go语言多态的实现与interface使用
2021/06/16 Golang