这个js分两部分:
- boolean值的属性处理
- 'src', 'srcset', 'href'属性的处理
先看第一部分 :boolean值的属性处理
var ngAttributeAliasDirectives = {}; forEach(BOOLEAN_ATTR, function(propName, attrName) { if (propName == "multiple") return; var normalized = directiveNormalize('ng-' + attrName); ngAttributeAliasDirectives[normalized] = function() { return { priority: 100, compile: function() { return function(scope, element, attr) { scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) { attr.$set(attrName, !!value); }); }; } }; }; });
-
if (propName == "multiple") return; multiple属性angular现在还不支持
ps:<select multiple="multiple"
size="2">
-
attr.$set(attrName, !!value);
关键是这里 !!value,这里将所有乱把起早的值全部转换成了bool值
不明白!!value的请看
https://github.com/rwaldron/idiomatic.js/blob/master/readme.md#cond
// Falsy: "", 0, null, undefined, NaN, void 0
这里给出了plunkr,自己去捣腾吧,哈哈
http://plnkr.co/edit/GFk5ECkW94ebs0nhKvAX?p=preview
补充下:$SCOPE.$watch保证了值一旦变了,会进行一次转换
还有,BOOLEAN_ATTR是常量,翻下源码可知:'multiple,selected,checked,disabled,readOnly,required,open'这些。
看下第二部分:‘src', 'srcset', 'href'属性的处理
forEach(['src', 'srcset', 'href'], function(attrName) { var normalized = directiveNormalize('ng-' + attrName); ngAttributeAliasDirectives[normalized] = function() { return { priority: 99, // it needs to run after the attributes are interpolated link: function(scope, element, attr) { attr.$observe(normalized, function(value) { if (!value) return; attr.$set(attrName, value); if (msie) element.prop(attrName, attr[attrName]); }); } }; }; });
attr.$set(attrName, value);
如果 ng-src=“xxx”,那么设置src=“xxx”;其他类似
为什么要做这么无聊的事呢,因为angular这样做,才有机会干点坏事
http://www.cnblogs.com/lvdabao/p/3379659.html 这上面 五、特殊的ng-src和ng-href 说明了这一点
angular框架是在DOMContentLoaded
之后,才开始执行,找ng-app,编译模板中的指令等。
注意DOMContentLoaded,如果 <img src="dsf{{ngValue}}sdkfj">这样一幅图片在dom中,页面就会阻塞,等待图片加载完,而图片的地址又是错误了,所以,你没给angular机会来做他的坏事。
所以在angular中,我们不使用src,href,而是用ng-href,ng-src
- if (msie) element.prop(attrName, attr[attrName]);
这个为了make ie happy
ie下,如果没有该属性,element.setAttribute('src', 'foo')不生效
我们也可以推断 attr.$set(attrName, value);用的是element.setAttribute方法
over
源码地址:
https://github.com/angular/angular.js/blob/ca116c35a63e06e62337ce9713a55d28ad9ebce8/src/ng/directive/booleanAttrs.js