From fe8d893b839e9b14e3e55a3a0523cc1e6355bdd5 Mon Sep 17 00:00:00 2001 From: Thibault Leruitte Date: Tue, 26 Feb 2013 11:14:27 +0100 Subject: feat($compile): allow directives to modify interpolated attributes A directive can now set/update/remove attribute values even those containing interpolation during the compile phase and have the new value be picked up during the compilation. For example in template:
the replace-directive can now replace the value of some-attr-or-directive during compilation which produces this intermitent template: or even as well as --- src/ng/compile.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'src') 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. */ -- cgit v1.2.3