aboutsummaryrefslogtreecommitdiffstats
path: root/src/ng/compile.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/ng/compile.js')
-rw-r--r--src/ng/compile.js31
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);
});