aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDi Peng2011-07-07 11:42:02 -0700
committerIgor Minar2011-07-13 16:42:38 -0700
commit2428907259fa80ec3b1b4bfd85ea20028a9f4fa5 (patch)
treea61869d93e358fb21e264ba74ce2ae718d94c0da
parent8a8a2cf4623708b69dba3816e22b01407e338b73 (diff)
downloadangular.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.js25
-rw-r--r--test/directivesSpec.js41
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');
+ });
});