@@ -3,13 +3,13 @@ part of angular.directive;
3
3
/**
4
4
* Allows adding and removing the boolean attributes from the element.
5
5
*
6
- * Using `<button disabled="{{ false}} ">` does not work since it would result
6
+ * Using `<button disabled="false">` does not work since it would result
7
7
* in `<button disabled="false">` rather than `<button>` .
8
- * Browsers change behavior based on presence/absence of attribute rather the
8
+ * Browsers change behavior based on presence/absence of the attribute rather
9
9
* its value.
10
10
*
11
11
* For this reason we provide alternate `ng-` attribute directives to
12
- * add/remove boolean attributes such as `<button ng-disabled="{{ false}} ">`
12
+ * add/remove boolean attributes such as `<button ng-disabled="false">`
13
13
* which will result in proper removal of the attribute.
14
14
*
15
15
* The full list of supported attributes are:
@@ -30,18 +30,25 @@ part of angular.directive;
30
30
@NgDirective (selector: '[ng-required]' , map: const {'ng-required' : '=>required' })
31
31
@NgDirective (selector: '[ng-selected]' , map: const {'ng-selected' : '=>selected' })
32
32
class NgBooleanAttributeDirective {
33
- final NodeAttrs attrs;
34
- NgBooleanAttributeDirective (this .attrs);
33
+ final NgElement _ngElement;
35
34
36
- _setBooleanAttribute (name, value) => attrs[name] = ( toBool (value) ? '' : null );
35
+ NgBooleanAttributeDirective ( this ._ngElement );
37
36
38
- set checked (value) => _setBooleanAttribute ('checked' , value);
39
- set disabled (value) => _setBooleanAttribute ('disabled' , value);
40
- set multiple (value) => _setBooleanAttribute ('multiple' , value);
41
- set open (value) => _setBooleanAttribute ('open' , value);
42
- set readonly (value) => _setBooleanAttribute ('readonly' , value);
43
- set required (value) => _setBooleanAttribute ('required' , value);
44
- set selected (value) => _setBooleanAttribute ('selected' , value);
37
+ void set checked (value) => _toggleAttribute ('checked' , value);
38
+ void set disabled (value) => _toggleAttribute ('disabled' , value);
39
+ void set multiple (value) => _toggleAttribute ('multiple' , value);
40
+ void set open (value) => _toggleAttribute ('open' , value);
41
+ void set readonly (value) => _toggleAttribute ('readonly' , value);
42
+ void set required (value) => _toggleAttribute ('required' , value);
43
+ void set selected (value) => _toggleAttribute ('selected' , value);
44
+
45
+ void _toggleAttribute (attrName, [value]) {
46
+ if (toBool (value)) {
47
+ _ngElement.setAttribute (attrName);
48
+ } else {
49
+ _ngElement.removeAttribute (attrName);
50
+ }
51
+ }
45
52
}
46
53
47
54
/**
@@ -61,16 +68,17 @@ class NgBooleanAttributeDirective {
61
68
* - [ng-src]
62
69
* - [ng-srcset]
63
70
*/
71
+ // todo(vicb) handle in mustache - but might be no interp
64
72
@NgDirective (selector: '[ng-href]' , map: const {'ng-href' : '@href' })
65
73
@NgDirective (selector: '[ng-src]' , map: const {'ng-src' : '@src' })
66
74
@NgDirective (selector: '[ng-srcset]' , map: const {'ng-srcset' : '@srcset' })
67
75
class NgSourceDirective {
68
- final NodeAttrs attrs ;
69
- NgSourceDirective (this .attrs );
76
+ final NgElement _ngElement ;
77
+ NgSourceDirective (this ._ngElement );
70
78
71
- set href (value) => attrs[ 'href' ] = value;
72
- set src (value) => attrs[ 'src' ] = value;
73
- set srcset (value) => attrs[ 'srcset' ] = value;
79
+ void set href (value) => _ngElement. setAttribute ( 'href' , value) ;
80
+ void set src (value) => _ngElement. setAttribute ( 'src' , value) ;
81
+ void set srcset (value) => _ngElement. setAttribute ( 'srcset' , value) ;
74
82
75
83
}
76
84
@@ -84,23 +92,39 @@ class NgSourceDirective {
84
92
*
85
93
* @example
86
94
* <svg>
87
- * <circle ng-attr-cx="{{cx}} "></circle>
95
+ * <circle ng-attr-cx="cx "></circle>
88
96
* </svg>
89
97
*/
98
+ // todo(vicb) handle in mustache - but might be no interp
90
99
@NgDirective (selector: '[ng-attr-*]' )
91
100
class NgAttributeDirective implements NgAttachAware {
92
- final NodeAttrs _attrs;
101
+ static const NG_ATTR_PREFIX = 'ng-attr-' ;
102
+ final dom.Element _element;
103
+ final NgElement _ngElement;
104
+ final Scope _scope;
105
+ final Interpolate _interpolate;
106
+ final FilterMap _filters;
93
107
94
- NgAttributeDirective (this ._attrs);
108
+ NgAttributeDirective (this ._element, this ._ngElement, this ._scope,
109
+ this ._interpolate, this ._filters);
95
110
96
111
void attach () {
97
- String ngAttrPrefix = 'ng-attr-' ;
98
- _attrs.forEach ((key, value) {
99
- if (key.startsWith (ngAttrPrefix)) {
100
- var newKey = key.substring (ngAttrPrefix.length);
101
- _attrs[newKey] = value;
102
- _attrs.observe (key, (newValue) => _attrs[newKey] = newValue );
112
+ _element.attributes.forEach ((String rawName, String value) {
113
+ if (rawName.startsWith (NG_ATTR_PREFIX )) {
114
+ var attrName = rawName.substring (NG_ATTR_PREFIX .length);
115
+ var expression = _interpolate (value);
116
+ _scope.watch (expression, (v, _) => _updateAttribute (attrName, v),
117
+ canChangeModel: false , filters: _filters);
118
+ _updateAttribute (attrName, '' );
103
119
}
104
120
});
105
121
}
122
+
123
+ void _updateAttribute (attrName, value) {
124
+ if (value == null ) {
125
+ _ngElement.removeAttribute (attrName);
126
+ } else {
127
+ _ngElement.setAttribute (attrName, value);
128
+ }
129
+ }
106
130
}
0 commit comments