diff options
| author | Luis Ramón López | 2013-02-26 00:00:47 +0100 | 
|---|---|---|
| committer | Igor Minar | 2013-02-27 00:55:40 -0800 | 
| commit | cf17c6af475eace31cf52944afd8e10d3afcf6c0 (patch) | |
| tree | aa552c9f6b8af0ff0ed208ec6c3a5574432a4109 /src | |
| parent | 86d191ed4aea9015adc71b852223475c5c762c34 (diff) | |
| download | angular.js-cf17c6af475eace31cf52944afd8e10d3afcf6c0.tar.bz2 | |
feat($compile): add attribute binding support via ngAttr*
Sometimes is not desirable to use interpolation on attributes because
the user agent parses them before the interpolation takes place. I.e:
<svg>
  <circle cx="{{cx}}" cy="{{cy}}" r="{{r}}"></circle>
</svg>
The snippet throws three browser errors, one for each attribute.
For some attributes, AngularJS fixes that behaviour introducing special
directives like ng-href or ng-src.
This commit is a more general solution that allows prefixing any
attribute with "ng-attr-", "ng:attr:" or "ng_attr_"  so it will
be set only when the binding is done. The prefix is then removed.
Example usage:
<svg>
  <circle ng-attr-cx="{{cx}}" ng-attr-cy="{{cy}}" ng:attr-r="{{r}}"></circle>
</svg>
Closes #1050
Closes #1925
Diffstat (limited to 'src')
| -rw-r--r-- | src/ng/compile.js | 10 | 
1 files changed, 8 insertions, 2 deletions
diff --git a/src/ng/compile.js b/src/ng/compile.js index 48beb61e..3746bb66 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -349,7 +349,8 @@ function $CompileProvider($provide) {              ? identity              : function denormalizeTemplate(template) {                return template.replace(/\{\{/g, startSymbol).replace(/}}/g, endSymbol); -            }; +        }, +        NG_ATTR_BINDING = /^ngAttr[A-Z]/;      return compile; @@ -514,11 +515,16 @@ function $CompileProvider($provide) {                directiveNormalize(nodeName_(node).toLowerCase()), 'E', maxPriority);            // iterate over the attributes -          for (var attr, name, nName, value, nAttrs = node.attributes, +          for (var attr, name, nName, ngAttrName, value, nAttrs = node.attributes,                     j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) {              attr = nAttrs[j];              if (attr.specified) {                name = attr.name; +              // support ngAttr attribute binding +              ngAttrName = directiveNormalize(name); +              if (NG_ATTR_BINDING.test(ngAttrName)) { +                name = ngAttrName.substr(6).toLowerCase(); +              }                nName = directiveNormalize(name.toLowerCase());                attrsMap[nName] = name;                attrs[nName] = value = trim((msie && name == 'href')  | 
