diff options
| author | Di Peng | 2011-07-07 11:42:02 -0700 | 
|---|---|---|
| committer | Igor Minar | 2011-07-13 16:42:38 -0700 | 
| commit | 2428907259fa80ec3b1b4bfd85ea20028a9f4fa5 (patch) | |
| tree | a61869d93e358fb21e264ba74ce2ae718d94c0da | |
| parent | 8a8a2cf4623708b69dba3816e22b01407e338b73 (diff) | |
| download | angular.js-2428907259fa80ec3b1b4bfd85ea20028a9f4fa5.tar.bz2 | |
fix(ng:class): preserve classes added post compilation
- make sure ng:class preserve classes added after compilation
Closes #355
| -rw-r--r-- | src/directives.js | 25 | ||||
| -rw-r--r-- | test/directivesSpec.js | 41 | 
2 files changed, 56 insertions, 10 deletions
| diff --git a/src/directives.js b/src/directives.js index aa30fab2..00e6a1d7 100644 --- a/src/directives.js +++ b/src/directives.js @@ -568,18 +568,25 @@ angularDirective("ng:submit", function(expression, element) {    });  }); -  function ngClass(selector) {    return function(expression, element){ -    var existing = element[0].className + ' ';      return function(element){ -      this.$onEval(function(){ -        if (selector(this.$index)) { -          var value = this.$eval(expression); -          if (isArray(value)) value = value.join(' '); -          element[0].className = trim(existing + value); -        } -      }, element); +      if(selector(this.$index)) { +        this.$watch(expression, function(newCls, oldCls) { +          var cls = element.attr('class'); +          if (isArray(newCls)) newCls = newCls.join(' '); +          if (isArray(oldCls)) oldCls = oldCls.join(' '); + +          // The time when newCls == oldCLs is when $watch just started +          if (newCls == oldCls) { +            cls += ' ' + newCls; +          } else { +            cls = cls.replace(' ' + oldCls, ' ' + newCls); +          } + +          element.attr('class', cls); +        }); +      }      };    };  } diff --git a/test/directivesSpec.js b/test/directivesSpec.js index 713147ad..a640fc50 100644 --- a/test/directivesSpec.js +++ b/test/directivesSpec.js @@ -177,7 +177,7 @@ describe("directive", function(){    describe('ng:class', function() { -    it('should add new and remove old classes dynamically', function() { +    it('should change current class or remove old classes dynamically', function() {        var scope = compile('<div class="existing" ng:class="dynClass"></div>');        scope.dynClass = 'A';        scope.$eval(); @@ -204,6 +204,45 @@ describe("directive", function(){        expect(element.hasClass('A')).toBeTruthy();        expect(element.hasClass('B')).toBeTruthy();      }); + +    it('should preserve class added post compilation', function() { +      var scope = compile('<div class="existing" ng:class="dynClass"></div>'); +      scope.dynClass = 'A'; +      scope.$eval(); +      expect(element.hasClass('existing')).toBe(true); + +      // add extra class, change model and eval +      element.addClass('newClass'); +      scope.dynClass = 'B'; +      scope.$eval(); + +      expect(element.hasClass('existing')).toBe(true); +      expect(element.hasClass('B')).toBe(true); +      expect(element.hasClass('newClass')).toBe(true); +    }); + +    it('should preserve class added post compilation even without existing classes"', function() { +      var scope = compile('<div ng:class="dynClass"></div>'); +      scope.dynClass = 'A'; +      scope.$eval(); +      expect(element.hasClass('A')).toBe(true); + +      // add extra class, change model and eval +      element.addClass('newClass'); +      scope.dynClass = 'B'; +      scope.$eval(); + +      expect(element.hasClass('B')).toBe(true); +      expect(element.hasClass('newClass')).toBe(true); +    }); + +    it('should preserve right classes"', function() { +      var scope = compile('<div class="ui-panel ui-selected" ng:class="dynCls"></div>'); +      scope.dynCls = 'panel'; +      scope.dynCls = 'foo'; +      scope.$eval(); +      expect(element.attr('class')).toBe('ui-panel ui-selected ng-directive foo'); +    });    }); | 
