这个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