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示例收集
Nov 05 Javascript
Query中click(),bind(),live(),delegate()的区别
Nov 19 Javascript
JS+CSS实现精美的二级导航效果代码
Sep 17 Javascript
Javascript获取数组中的最大值和最小值的方法汇总
Jan 01 Javascript
js中实现字符串和数组的相互转化详解
Jan 24 Javascript
Node.js的项目构建工具Grunt的安装与配置教程
May 12 Javascript
javascript事件冒泡简单示例
Jun 20 Javascript
JS实现的手机端精简幻灯片效果
Sep 05 Javascript
前端开发之CSS原理详解
Mar 11 Javascript
ES6新特性之函数的扩展实例详解
Apr 01 Javascript
react-native中ListView组件点击跳转的方法示例
Sep 30 Javascript
Es6 Generator函数详细解析
Feb 24 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支持时的替代方案
2006/10/09 PHP
PHP获取当前日期和时间及格式化方法参数
2015/05/11 PHP
在PHP程序中使用Rust扩展的方法
2015/07/03 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
jQuery live( type, fn ) 委派事件实现
2009/10/11 Javascript
ext jquery 简单比较
2010/04/07 Javascript
基于jquery的表格排序
2010/09/11 Javascript
JS控件的生命周期介绍
2012/10/22 Javascript
ajax处理php返回json数据的实例代码
2013/01/24 Javascript
js导出格式化的excel 实例方法
2013/07/17 Javascript
Jquery显示、隐藏元素以及添加删除样式
2013/08/09 Javascript
jQuery内置的AJAX功能和JSON的使用实例
2014/07/27 Javascript
JavaScript 拖拽实例代码
2016/09/21 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
2016/10/10 Javascript
使用 NodeJS+Express 开发服务端的简单介绍
2017/04/07 NodeJs
Nodejs回调加超时限制两种实现方法
2017/06/09 NodeJs
使用webpack打包koa2 框架app
2018/02/02 Javascript
vue项目部署到Apache服务器中遇到的问题解决
2018/08/24 Javascript
JavaScript寄生组合式继承原理与用法分析
2019/01/11 Javascript
JavaScript对象属性操作实例解析
2020/02/04 Javascript
简单了解JavaScript弹窗实现代码
2020/05/07 Javascript
vue v-for出来的列表,点击某个li使得当前被点击的li字体变红操作
2020/07/17 Javascript
js实现移动端轮播图滑动切换
2020/12/21 Javascript
介绍Python的Urllib库的一些高级用法
2015/04/30 Python
Python 使用requests模块发送GET和POST请求的实现代码
2016/09/21 Python
PHP实现发送和接收JSON请求
2018/06/07 Python
Django REST Framework 分页(Pagination)详解
2020/11/30 Python
详解HTML5新增标签
2017/11/27 HTML / CSS
英国莱斯特松木橡木家具网上商店:Choice Furniture Superstore
2019/07/05 全球购物
美国运动鞋类和服装零售连锁店:Shoe Palace
2019/08/13 全球购物
营销专业应届生求职信
2013/11/26 职场文书
蜜蜂引路教学反思
2014/02/04 职场文书
感恩的演讲稿
2014/05/06 职场文书
写求职信有哪些注意事项
2014/05/08 职场文书
电子信息工程自荐信
2014/05/26 职场文书
廉洁自律承诺书2016
2016/03/25 职场文书