angular 指令 要点解析
指令可以删繁就简前端的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 ,强大的扩展性。
/**
* @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)
最后推荐有些异常情况无法解决的同仁直接查看源码,angular.js @license AngularJS v1.2.19
compileNodes 便是编译DOM元素的方法,里面applyDirectivesToNode 为实际处理指令的方法。 跟一下相信就清楚了。
angular 指令 要点解析的更多相关文章
- AngularJS中的指令全面解析(转载)
说到AngularJS,我们首先想到的大概也就是双向数据绑定和指令系统了,这两者也是AngularJS中最为吸引人的地方.双向数据绑定呢,感觉没什么好说的,那么今天我们就来简单的讨论下AngularJ ...
- [AngularJS]ng-repeat指令要点
ng-repeat指令要点 1,基本格式,这里不作过多说明,需要的话查看文档 <div ng-repeat="item in someCollection [| someFilter: ...
- angular指令深度学习篇
angular指令深度学习-过滤器 limitTo ... <body ng-app="app" > <div ng-controller="myCtr ...
- Angular指令渗透式理解
通过一段时间对angular指令的使用,理解了angular指令的意义,下面逐一介绍一下. ng-app:定义一个angualr模块,表示angular作用的范围,如下代码: ng-app在html标 ...
- Angular4 后台管理系统搭建(9) - 用自定义angular指令,实现在服务端验证
最近这段时间发现,北京这用angular4 或 angular2的公司很少.几乎是没有.很担心自己是不是把精力放到了不应该的地方.白耽误了时间.但是随着我对新版angular框架理解的加深.个人感觉a ...
- angular指令之complie和link不得不说的故事
angular指令比较晦涩难懂的就是complie和link字段了,什么时候该用complie?什么时候该用link?总是很难分别清楚.当理解了指令的真正编译原理的时候,就会发现这相当的简单. ng怎 ...
- Java二进制指令代码解析
http://www.blogjava.net/DLevin/archive/2011/09/13/358497.html http://blog.csdn.net/sum_rain/article/ ...
- angular核心原理解析3:指令的执行过程
指令的执行过程分析. 我们知道指令的执行分两个阶段,一个是compile,一个是link. 我们可以在指令中自定义compile和link. 首先,我们来讲解如何自定义link函数 举个例子: < ...
- Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定
一放假就高产似母猪了. 00.混乱的前端界 Angular1.x确实是个学习成本很高的框架,刚开始实习那会儿,前端啥也不懂,工头说用Angular,我们这群小弟也只能硬着头皮学.在这之前,前端的东西大 ...
随机推荐
- mysql 查询copy to tmp table造成堵塞
show full PROCESSLIST; show VARIABLES like 'tmp_table_size' set GLOBAL tmp_table_size=629145600; SHO ...
- SQL中对日期进行模糊查询的方法
在我们通过SQL语句对数据库中的数据进行查询时,难免会遇到针对datetime的查询,但是因为一般情况下,输入的时间条件为年月日,所以,这种情况下,我们就要进行一下模糊查询,首先,摒弃一种投机取巧的方 ...
- DOS头 IMAGE_DOS_HEADER
IMAGE_DOS_HEADER STRUCT { +0h WORD e_magic // Magic DOS signature MZ(4Dh 5Ah) DOS可执行文件标记 +2h WORD e_ ...
- UIImagePickerController 操作图库
UIImagePickerController详解 转载自:http://blog.csdn.net/kingsley_cxz/article/details/9157093 1.UIImage ...
- 从汇编来看c语言之变量
1.基础研究 对如图程序进行编译连接,再用debug加载. 我们在偏移地址1fa处查看main函数的内容: 执行到1fd处,发现n的偏移地址为01a6,段地址存储在ds寄存器里,为07c4. 再查看函 ...
- java多线程下单例的实现
Abstract 在开发中,如果某个实例的创建需要消耗很多系统资源,那么我们通常会使用惰性加载机制,也就是说只有当使用到这个实例的时候才会创建这个实例,这个好处在单例模式中得到了广泛应用.这个机制在s ...
- IE 将“通过域访问数据源”设置为启用(注册表)
XP HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\1\1406 Vista+ HKCU\Softwar ...
- Android中观察者模式的升入理解
以前对Java中的观察者模式只知道一点皮毛,在接触Android的过程中,逐渐认识到观察者模式是如此的重要,android中许多地方都用到了观察者模式例如ContentResolver操作,来总结一下 ...
- 11g v$session定位客户端IP
11g v$session 新增PORT 字段 用于描述客户端的端口号 客户机从10.5.129.180 访问10.5.128.28 [oracle@cpool ~]$ netstat -na | g ...
- 【转】ubuntu连接android设备(附最简单方法)
原文网址:http://blog.csdn.net/maosidiaoxian/article/details/22661725 在ubuntu下连接android设备,虽然不用像windows那样安 ...