指令可以删繁就简前端的js代码,杜绝重复的js代码和html代码。

下面就对指令的重要属性进行罗列

一、restrict  定义指令的出现形式

   可以定义为多种形式,比如 restrict = 'AE' 标识可以是属性,也可以是元素。restrict  =  'AECM' 则标识支持下面所有形式

  • Attribute 属性: <div my-directive=”exp”></div>
  • Element 元素: <my-directive></my-directive>
  • Class : <div class=”my-directive:exp;”></div>
  • M 注释:<!-- directive: my-directive exp -->

 鉴于浏览器兼容问题。推荐 restrict  =  'A'

二、scope 作用域,与值绑定

  scope  = true/false/{name:'=/@/&'}   

  默认为false,如果设置为true 则说明指令内部独立作用域。

  scope: {
   lover: '=',
   name: '@',
   say: '&'
  }

  1、{name:'@inputName'} name 指 指令中作用域中scope.name , inputName 可不写。默认绑定属性name。eg:<directive inputName="小明-{{data.class}}">

  

  2、= 双向绑定比较常用

  如:<lover="绑定内容"> 绑定内容可以理解为指令外部scope环境中的所有。它已经不是字符串的意义。甚至比如一个function的引用。 lover="sayChange" 那么love()就执行scope.sayChange(),如果scope.sayChange是对象、那么lover改变与sayChange改变均会联动修改关联的对方。

  3、”&“:绑定 Contoller中对应$scope上的函数。

 

三、template/templateUrl

  模板,该指令内部会被改html所代替, 如果设置了replace =true ,则outerHtml也会被移除。(会影响改标签后面的其他指令)

四、combine编译阶段 提供两个参数element,attrs。

  可以对当前元素做一些操作。返回link方法或者什么prelink等等。细节不说了。感觉用的也不多。 此处存在一个小bug 这个阶段给element添加进去的html包含{{}} 到后面不会执行。但是加上 template=“”,就可以解决

五、link 参数为 scope ,element,attrs ,ctrl  ( ctrl 当  require = ngController才会有)

  如果有combine,link需要作为combine的return 对象。

  link require="ngModel",则可以拿到ngModelController,那么Ctrl就可以有很多的扩展点,这也是我要写本文的目的所在。其他事不过走走过场而已。

  ngModel对于值有两个重要的概念叫modelValue,和viewValue  见名知意,我们可以理解为数据库持久化值为ModelValue而最终展示到UI上给用户看到的是viewValue。他们可以不同。

  1、ctrl.$formatters 格式化链 ngModel 的 ModelValue to ViewVlaue过程中需要有序执行的一串 function,

    那就太方便了。比如扩展格式化:日期、金额格式化;校验:假如modelValue不合法、则不会展示到前端。

  2、 ctrl.$parsers 解析链 ngModel 的 ViewValue to ModelValue过程中需要执行的一串function

    同样在 反格式化的处理:金额去除¥符号转为数字;校验不合法的数据无法提交给ModelView,(不提交给ModelValue 其他对改字段监控变化就不会得到通知。   angular双向绑定多么美妙的设计,)

  3、ctrl.$render 当视图需要更新时执行

    比如checkbox viewValue改成了false,render会将原生checkbox 的checked=true,可以重新赋值修改该function

最后提供几个例子可以感受formatters ,parsers ,强大的扩展性。

checkBox 数据库值为逗号分隔

 /**
* @ht-boolean 可为空, 格式以“/”分割truevalue 和falsevalue
* <span ht-boolean="Y/N" text="测试按钮" ng-model="prop.skipFirstNode" ht-tip title="我是按钮的提示"/>
*/
.directive('htBoolean', function() {
return {
restrict : 'A',
require:'ngModel',
scope : true,
link : function(scope, element, attrs,ctrl) {
var booleanConf =attrs.htBoolean;
scope.text = attrs.text;
if(booleanConf) booleanConf=booleanConf.split("/");
else booleanConf = [true,false]; var trueValue = booleanConf[0],falseValue = booleanConf[1]; ctrl.$formatters.push(function(value){
return value === trueValue;
}); ctrl.$parsers.push(function(value){
return value ? trueValue : falseValue;
}); ctrl.$render = function(){
scope.checked = ctrl.$viewValue;
}; element.on('click', function(){
scope.$apply(function() {
scope.checked = !scope.checked;
ctrl.$setViewValue(scope.checked);
});
});
},
template:'<lable class="btn label-sm {{checked ? \'active\':\'inactive\'}}" >{{text}}</lable>'
};
})

ht-boolean代替checkBox的自定义前端标签。(针对true、false两种状态的指令) 体验下$render的功能

 自定义表单校验 扩展平台自有校验

  

六、controller($scope,element)

 
  controller 先与combine执行。 

  

  

最后推荐有些异常情况无法解决的同仁直接查看源码,angular.js   @license AngularJS v1.2.19

 compileNodes 便是编译DOM元素的方法,里面applyDirectivesToNode 为实际处理指令的方法。 跟一下相信就清楚了。

angular 指令 要点解析的更多相关文章

  1. AngularJS中的指令全面解析(转载)

    说到AngularJS,我们首先想到的大概也就是双向数据绑定和指令系统了,这两者也是AngularJS中最为吸引人的地方.双向数据绑定呢,感觉没什么好说的,那么今天我们就来简单的讨论下AngularJ ...

  2. [AngularJS]ng-repeat指令要点

    ng-repeat指令要点 1,基本格式,这里不作过多说明,需要的话查看文档 <div ng-repeat="item in someCollection [| someFilter: ...

  3. angular指令深度学习篇

    angular指令深度学习-过滤器 limitTo ... <body ng-app="app" > <div ng-controller="myCtr ...

  4. Angular指令渗透式理解

    通过一段时间对angular指令的使用,理解了angular指令的意义,下面逐一介绍一下. ng-app:定义一个angualr模块,表示angular作用的范围,如下代码: ng-app在html标 ...

  5. Angular4 后台管理系统搭建(9) - 用自定义angular指令,实现在服务端验证

    最近这段时间发现,北京这用angular4 或 angular2的公司很少.几乎是没有.很担心自己是不是把精力放到了不应该的地方.白耽误了时间.但是随着我对新版angular框架理解的加深.个人感觉a ...

  6. angular指令之complie和link不得不说的故事

    angular指令比较晦涩难懂的就是complie和link字段了,什么时候该用complie?什么时候该用link?总是很难分别清楚.当理解了指令的真正编译原理的时候,就会发现这相当的简单. ng怎 ...

  7. Java二进制指令代码解析

    http://www.blogjava.net/DLevin/archive/2011/09/13/358497.html http://blog.csdn.net/sum_rain/article/ ...

  8. angular核心原理解析3:指令的执行过程

    指令的执行过程分析. 我们知道指令的执行分两个阶段,一个是compile,一个是link. 我们可以在指令中自定义compile和link. 首先,我们来讲解如何自定义link函数 举个例子: < ...

  9. Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定

    一放假就高产似母猪了. 00.混乱的前端界 Angular1.x确实是个学习成本很高的框架,刚开始实习那会儿,前端啥也不懂,工头说用Angular,我们这群小弟也只能硬着头皮学.在这之前,前端的东西大 ...

随机推荐

  1. 写一个MyORM--利用反射的方法

    本文的目的是为了更加深刻的理解反射. ORM:Object Relational Mapping对象关系映射,是解决了面向对象语言和关系型数据库不匹配的问题. ORM是一种思想,实现这种思想的技术有很 ...

  2. asp.net执行cmd命令(包括第三方应用的命令行)

    Process p = new Process(); p.StartInfo.FileName = "cmd.exe"; p.StartInfo.UseShellExecute = ...

  3. V9 二次开发技术篇之 模型数据库

    应V9粉丝的建议,本人今天讲一下 MVC中的M 数据库模型 首先 在 phpcms\model  建一个模型文件test_model.class.php <?phpdefined('IN_PHP ...

  4. Nginx源码研究三:Epoll在NGINX中的使用

    Web服务器在面对高并发的情况下,网络的IO一般选择IO复用,像apache选择的Select/poll.Nginx在linux 2.6后选择Epoll做网路IO,提高了WEB服务的并发能力. 在本章 ...

  5. hadoop+spark+mongodb+mysql+c#

    一.前言 从20世纪90年代数字化医院概念提出到至今的20多年时间,数字化医院(Digital Hospital)在国内各大医院飞速的普及推广发展,并取得骄人成绩.不但有数字化医院管理信息系统(HIS ...

  6. reaver 使用方法和技巧

    reaver非常的不错,为我们ceng网带了最大的方便,使用简单,我来讲一下自己使用心得吧! 第一步,如果用虚拟机用vmware的,总会出现鼠标不灵点不到地方,换了一个 6.0.2 build-598 ...

  7. 转:堆(heap)和栈(stack)有什么区别??

    简单的可以理解为: heap:是由malloc之类函数分配的空间所在地.地址是由低向高增长的. stack:是自动分配变量,以及函数调用的时候所使用的一些空间.地址是由高向低减少的. 预备知识—程序的 ...

  8. [LeetCode 119] - 杨辉三角形II(Pascal's Triangle II)

    问题 给出一个索引k,返回杨辉三角形的第k行. 例如,给出k = 3,返回[1, 3, 3, 1] 注意: 你可以优化你的算法使之只使用O(k)的额外空间吗? 初始思路 首先来复习复习杨辉三角形的性质 ...

  9. 不建议用wxWidgets,底层有过多的bug

    不建议用wxWidgets, 搞了wxWidgets 3年,不是所说的那么容易跨平台,很多bug,不稳定, 莫名其妙的崩溃找源代码修改编译真是费时费力. 开发速度真没有使用本地sdk开发高, 很难定制 ...

  10. TCP 协议

    == 已经了解了以太网和IP了,下面我们进入传输层,开始讲解TCP协议. == 仍然先把TCP报文段的格式放在这里,然后我们看图说话: TCP报文段也分为首部和数据两部分,首部默认情况下一般是20字节 ...