diff options
Diffstat (limited to 'src/ng/compile.js')
| -rw-r--r-- | src/ng/compile.js | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/src/ng/compile.js b/src/ng/compile.js index 0d9ff9ea..ee120263 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -221,9 +221,9 @@ function $CompileProvider($provide) { this.$get = [ '$injector', '$interpolate', '$exceptionHandler', '$http', '$templateCache', '$parse', - '$controller', + '$controller', '$rootScope', function($injector, $interpolate, $exceptionHandler, $http, $templateCache, $parse, - $controller) { + $controller, $rootScope) { var LOCAL_MODE = { attribute: function(localName, mode, parentScope, scope, attr) { @@ -268,7 +268,6 @@ function $CompileProvider($provide) { var Attributes = function(element, attr) { this.$$element = element; - this.$$observers = {}; this.$attr = attr || {}; }; @@ -286,7 +285,8 @@ function $CompileProvider($provide) { * @param {string=} attrName Optional none normalized name. Defaults to key. */ $set: function(key, value, writeAttr, attrName) { - var booleanKey = getBooleanAttrName(this.$$element[0], key); + var booleanKey = getBooleanAttrName(this.$$element[0], key), + $$observers = this.$$observers; if (booleanKey) { this.$$element.prop(key, value); @@ -314,7 +314,7 @@ function $CompileProvider($provide) { } // fire observers - forEach(this.$$observers[key], function(fn) { + $$observers && forEach($$observers[key], function(fn) { try { fn(value); } catch (e) { @@ -333,10 +333,17 @@ function $CompileProvider($provide) { * @returns {function(*)} the `fn` Function passed in. */ $observe: function(key, fn) { - // keep only observers for interpolated attrs - if (this.$$observers[key]) { - this.$$observers[key].push(fn); - } + var attrs = this, + $$observers = (attrs.$$observers || (attrs.$$observers = {})), + listeners = ($$observers[key] || ($$observers[key] = [])); + + listeners.push(fn); + $rootScope.$evalAsync(function() { + if (!listeners.$$inter) { + // no one registered attribute interpolation function, so lets call it manually + fn(attrs[key]); + } + }); return fn; } }; @@ -990,16 +997,16 @@ function $CompileProvider($provide) { directives.push({ priority: 100, compile: valueFn(function(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 define observers array only for interpolated attrs - // and ignore observers for non interpolated attrs to save some memory - attr.$$observers[name] = []; attr[name] = undefined; + ($$observers[name] || ($$observers[name] = [])).$$inter = true; scope.$watch(interpolateFn, function(value) { attr.$set(name, value); }); |
