Angular.JS中的指令引用template与指令当做属性详解


Posted in Javascript onMarch 30, 2017

一、引用template

对于指令,可以把它简单的理解成在特定DOM元素上运行的函数,指令可以扩展这个元素的功能。

指令要生效,那么html头里面要

<html lang="en" ng-app="app">

制定ng-app的值和定义指令的module名字一致:

angular.module('app',[])

指令的完整参数:

angular.module('myApp', [])
.directive('myDirective', function() {
 return {
 restrict: String,
 priority: Number,
 terminal: Boolean,
 template: String or Template Function:
 function(tElement, tAttrs) {...},
 templateUrl: String,
 replace: Boolean or String,
 scope: Boolean or Object,
 transclude: Boolean,
 controller: String or
 function(scope, element, attrs, transclude, otherInjectables) { ... },
 controllerAs: String,
 require: String,
 link: function(scope, iElement, iAttrs) { ... },
 compile: // 返回一个对象或连接函数,如下所示: function(tElement, tAttrs, transclude) {
 return {
 pre: function(scope, iElement, iAttrs, controller) { ... },
 post: function(scope, iElement, iAttrs, controller) { ... }
 }
 return function postLink(...) { ... }
 }
 };
 });

指令可以使用的方式:

restrict[string]

restrict是一个可选的参数。用于指定该指令在DOM中以何种形式被声明。默认值是A,即以属性的形式来进行声明。

可选值如下:

  • E(元素)<my-directive></my-directive>
  • A(属性,默认值)<div my-directive="expression"></div>
  • C(类名)<div class="my-directive:expression;"></div>
  • M(注释)<--directive:my-directive expression-->

replace[bool]

replace是一个可选参数,如果设置了这个参数,值必须为true,因为默认值为false。默认值意味着模板会被当作子元素插入到调用此指令的元素内部,

例如上面的示例默认值情况下,生成的html代码如下:

<my-directive value="http://www.baidu.com" text="百度"><a href="http://www.baidu.com" rel="external nofollow" rel="external nofollow" rel="external nofollow" >百度</a></my-directive>

如果设置replace=true

<a href="http://www.baidu.com" rel="external nofollow" rel="external nofollow" rel="external nofollow" value="http://www.baidu.com" text="百度">百度</a>

据我观察,这种效果只有设置restrict="E"的情况下,才会表现出实际效果。

template[string or function]

template参数是可选的,必须被设置为以下两种形式之一:

 一段HTML文本;

一个可以接受两个参数的函数,参数为tElement和tAttrs,并返回一个代表模板的字符串。tElement和tAttrs中的t代表template,是相对于instance的。

不管是返回html文本还是函数,都是最后替换一个html,和replace属性搭配使用的,先给出一个完整的index.heml directive.js,以这个为例子来说明:

<!doctype html>
<html lang="en" ng-app="app">

<head>
 <meta charset="utf-8">
 <title>My HTML File</title>
 <link rel="stylesheet" href="bootstrap/css/bootstrap.css" rel="external nofollow" rel="external nofollow" rel="external nofollow" >
 <script src="angularjs/angular.js"></script>
 <script src="mydirective.js"></script>
</head>

<body>
 <my-directive></my-directive>
</body>

</html>

然后js:

angular.module('app',[])
 .directive('myDirective', function () {
 return {
 restrict: 'E',
 template: '<a href="http://www.baidu.com" rel="external nofollow" rel="external nofollow" rel="external nofollow" >百度</a>'
 };
 })

最后的运行效果以及firebug查看到的效果:

Angular.JS中的指令引用template与指令当做属性详解

如果添加指令的replace属性为ture,那么就不会有这个directvie指令部分了:

Angular.JS中的指令引用template与指令当做属性详解

上面就是差别。

再说说指令定义里面模板参数是函数的情况,我们改写html以及js:

<!doctype html>
<html lang="en" ng-app="app">

<head>
 <meta charset="utf-8">
 <title>My HTML File</title>
 <link rel="stylesheet" href="bootstrap/css/bootstrap.css" rel="external nofollow" rel="external nofollow" rel="external nofollow" >
 <script src="angularjs/angular.js"></script>
 <script src="mydirective.js"></script>
</head>

<body>
 <my-directive value="http://www.baidu.com" text="百度"></my-directive>
</body>

</html>

js文件:
angular.module('app',[])
 .directive('myDirective', function () {
 return {
 restrict: 'EAC',
 template: function (elem, attr) {
  return "<a href='" + attr.value + "'>" + attr.text + "</a>";
 }
 };
 })

指令定义的template是一个函数对象,返回一个html的字符串,那么他的elem和attr就是分别代表这个指令和他在index.html里面的属性:

attr.value和attr.text分别对应:

<my-directive value="http://www.baidu.com" text="百度"></my-directive>

里面的value和text。

不replace的情况:

Angular.JS中的指令引用template与指令当做属性详解

二、指令当做属性

上面说过:

angular.module('myApp', []) 
 .directive('myDirective', function() { 
 return { 
 restrict: String, 后面省略

指令restrict有四种用法,默认是A,也就是当做属性,

  • E(元素)<my-directive></my-directive>
  • A(属性,默认值)<div my-directive="expression"></div>
  • C(类名)<div class="my-directive:expression;"></div>
  • M(注释)<--directive:my-directive expression-->

然后如果一个指令直接返回一个函数的时候,其实返回的一个link函数,比如:

angular.module('time', [])
 .directive('xxx', function() {
 return function(scope, element, attrs) {

这个是表示直接link。

当指令做属性的时候,有两重含义:

      1.在一个html元素里面制定为属性

      2.js定义的指令名。

看一个例子:

JS:

angular.module('time', [])
 .controller("Ctrl2", function($scope) {
 $scope.format = 'M/d/yy h:mm:ss a';
 })
 // Register the 'myCurrentTime' directive factory method.
 // We inject $timeout and dateFilter service since the factory method is DI.
 .directive('myCurrentTime', function($timeout, dateFilter) {
 // return the directive link function. (compile function not needed)
 return function(scope, element, attrs) {
  var format, // date format
  timeoutId; // timeoutId, so that we can cancel the time updates

  // used to update the UI
  function updateTime() {
  element.text(dateFilter(new Date(), format));
  }

  // watch the expression, and update the UI on change.
  scope.$watch(attrs.myCurrentTime, function(value) {
  format = value;
  updateTime();
  });

  // schedule update in one second
  function updateLater() {
  // save the timeoutId for canceling
  timeoutId = $timeout(function() {
   updateTime(); // update DOM
   updateLater(); // schedule another update
  }, 1000);
  }

  // listen on DOM destroy (removal) event, and cancel the next UI update
  // to prevent updating time ofter the DOM element was removed.
  element.bind('$destroy', function() {
  $timeout.cancel(timeoutId);
  });

  updateLater(); // kick off the UI update process.
 }
 });

然后index.html:

<!doctype html>
<html lang="en" ng-app="time">

<head>
 <meta charset="utf-8">
 <title>My HTML File</title>
 <link rel="stylesheet" href="bootstrap/css/bootstrap.css" rel="external nofollow" rel="external nofollow" rel="external nofollow" >
 <script src="angularjs/angular.js"></script>
 <script src="mydirective.js"></script>
</head>

<body>
 <div ng-controller="Ctrl2">
 Date format:
 <input ng-model="format">
 <hr/>
 Current time is: <span my-current-time="format"></span>
 </div>
</body>

</html>

注意:ng-app="time"一定要指明是time。否则无法关联起来。

分析如下:

  • 给span制定了一个属性,绑定到了scope里面的format
  • <span my-current-time="format"></span>
  • 定义了输入框,绑定了scope里面的format
  • <input ng-model="format">
  • 定义了controller -- Ctrl2, 然后引入了scope,定义了变量format
  • 定义了指令myCurrentTime , 然后就是和html里面的my-current-time="format"对应,html里面用破折号连起来,指令就是驼峰样子的myCurrentTime(首字母小写)
  • link函数的三个参数,以及attrs的使用:
    return function(scope, element, attrs) {
    scope.$watch(attrs.myCurrentTime, function(value) {
  • 可看到,myCurrentTime既是指令名字,然后在这个span元素里面又是属性名,他的值是format的真实值。
  • 用firebug看到:Angular.JS中的指令引用template与指令当做属性详解
  • 指令当成属性,不会有replace起作用的时候,不会被替换也不会插入,就是一个属性,后面的日期值,其实是updateTime()函数直接写elem.text的效果。
  • 此处指令当做属性的作用就是扩展当前元素的功能。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
Whatever:hover 无需javascript让IE支持丰富伪类
Jun 29 Javascript
用示例说明filter()与find()的用法以及children()与find()的区别分析
Apr 26 Javascript
javascript字符串替换函数如何一次性全部替换掉
Oct 30 Javascript
详解Javascript继承的实现
Mar 25 Javascript
AngularJS基础 ng-mouseenter 指令示例代码
Aug 02 Javascript
微信JSAPI支付操作需要注意的细节
Jan 10 Javascript
a标签置灰不可点击的实现方法
Feb 06 Javascript
vue实现微信分享朋友圈,发送朋友的示例讲解
Feb 10 Javascript
Angular6 写一个简单的Select组件示例
Aug 20 Javascript
微信小程序使用setData修改数组中单个对象的方法分析
Dec 30 Javascript
在vue中根据光标的显示与消失实现下拉列表
Sep 29 Javascript
Vue+ElementUI 中级联选择器Bug问题的解决
Jul 31 Javascript
jQuery源码解读之extend()与工具方法、实例方法详解
Mar 30 #jQuery
jQuery实现Select下拉列表进行状态选择功能
Mar 30 #jQuery
借助node实战JSONP跨域实例
Mar 30 #Javascript
js利用for in循环获取 一个对象的所有属性以及值的实例
Mar 30 #Javascript
Bootstrap实现的经典栅格布局效果实例【附demo源码】
Mar 30 #Javascript
实例详解display:none与visible:hidden的区别
Mar 30 #Javascript
JavaScript+Html5实现按钮复制文字到剪切板功能(手机网页兼容)
Mar 30 #Javascript
You might like
IIS6.0+PHP5.x+MySQL5.x+Zend3.0x+GD+phpMyAdmin2.8x通用安装实例(已经完成)
2006/12/06 PHP
PHP不用递归遍历目录下所有文件的代码
2014/07/04 PHP
PHP开发框架kohana3 自定义路由设置示例
2014/07/14 PHP
php实现格式化多行文本为Js可用格式
2015/04/15 PHP
php利用嵌套数组拼接与解析json的方法
2017/02/07 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
2019/05/27 PHP
jQuery EasyUI 中文API Layout(Tabs)
2010/04/27 Javascript
Js实现自定义右键行为
2015/03/26 Javascript
深入分析Javascript跨域问题
2015/04/17 Javascript
Node.js返回JSONP详解
2016/05/18 Javascript
jQuery使用ajax方法解析返回的json数据功能示例
2017/01/10 Javascript
100多个基础常用JS函数和语法集合大全
2017/02/16 Javascript
vue 计时器组件的实现代码
2017/09/14 Javascript
vue项目实现记住密码到cookie功能示例(附源码)
2018/01/31 Javascript
解析vue data不可以使用箭头函数问题
2018/07/03 Javascript
[01:48]2018DOTA2亚洲邀请赛主赛事第二日五佳镜头 VG完美团战逆转TNC
2018/04/05 DOTA
[45:25]完美世界DOTA2联赛循环赛 PXG vs IO 第一场 11.06
2020/11/09 DOTA
pyqt4教程之实现windows窗口小示例分享
2014/03/07 Python
跟老齐学Python之网站的结构
2014/10/24 Python
Python获取邮件地址的方法
2015/07/10 Python
python Flask实现restful api service
2017/12/04 Python
python获取时间及时间格式转换问题实例代码详解
2018/12/06 Python
详解一种用django_cache实现分布式锁的方式
2019/09/01 Python
python 实现将list转成字符串,中间用空格隔开
2019/12/25 Python
python标准库OS模块函数列表与实例全解
2020/03/10 Python
python网络编程:socketserver的基本使用方法实例分析
2020/04/09 Python
python TCP包注入方式
2020/05/05 Python
Python偏函数实现原理及应用
2020/11/20 Python
html5 canvas实现跟随鼠标旋转的箭头
2016/03/11 HTML / CSS
HTML5本地数据库基础操作详解
2016/04/26 HTML / CSS
Easy Spirit官网:美国休闲鞋履中的代表品牌
2019/04/12 全球购物
公证书样本
2014/04/10 职场文书
经济贸易系求职信
2014/08/04 职场文书
英文自荐信范文
2015/03/25 职场文书
治庸问责工作总结
2015/08/11 职场文书
MyBatis自定义SQL拦截器示例详解
2021/10/24 Java/Android