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);            }); | 
