aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ng/compile.js14
-rw-r--r--test/ng/compileSpec.js14
2 files changed, 22 insertions, 6 deletions
diff --git a/src/ng/compile.js b/src/ng/compile.js
index c04d3871..6606dc6c 100644
--- a/src/ng/compile.js
+++ b/src/ng/compile.js
@@ -1102,11 +1102,13 @@ function $CompileProvider($provide) {
compile: valueFn(function attrInterpolateLinkFn(scope, element, attr) {
var $$observers = (attr.$$observers || (attr.$$observers = {}));
- if (name === 'class') {
- // we need to interpolate classes again, in the case the element was replaced
- // and therefore the two class attrs got merged - we want to interpolate the result
- interpolateFn = $interpolate(attr[name], true);
- }
+ // we need to interpolate again, in case the attribute value has been updated
+ // (e.g. by another directive's compile function)
+ interpolateFn = $interpolate(attr[name], true);
+
+ // if attribute was updated so that there is no interpolation going on we don't want to
+ // register any observers
+ if (!interpolateFn) return;
attr[name] = interpolateFn(scope);
($$observers[name] || ($$observers[name] = [])).$$inter = true;
@@ -1203,7 +1205,7 @@ function directiveNormalize(name) {
* @param {string} name Normalized element attribute name of the property to modify. The name is
* revers translated using the {@link ng.$compile.directive.Attributes#$attr $attr}
* property to the original name.
- * @param {string} value Value to set the attribute to.
+ * @param {string} value Value to set the attribute to. The value can be an interpolated string.
*/
diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js
index f81199cb..9614030c 100644
--- a/test/ng/compileSpec.js
+++ b/test/ng/compileSpec.js
@@ -1503,6 +1503,12 @@ describe('$compile', function() {
expect(attr.$observe('someAttr', observeSpy)).toBe(observeSpy);
};
});
+ directive('replaceSomeAttr', valueFn({
+ compile: function(element, attr) {
+ attr.$set('someAttr', 'bar-{{1+1}}');
+ expect(element).toBe(attr.$$element);
+ }
+ }));
}));
@@ -1544,6 +1550,14 @@ describe('$compile', function() {
}));
+ it('should allow directive to replace interpolated attributes before attr interpolation compilation', inject(
+ function($compile, $rootScope) {
+ element = $compile('<div some-attr="foo-{{1+1}}" replace-some-attr></div>')($rootScope);
+ $rootScope.$digest();
+ expect(element.attr('some-attr')).toEqual('bar-2');
+ }));
+
+
it('should call observer of non-interpolated attr through $evalAsync',
inject(function($rootScope, $compile) {
$compile('<div some-attr="nonBound" observer></div>')($rootScope);