Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

fix(ng:class): ng:class{,-odd,-even} shouldn't reset element classes #462

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 16 additions & 9 deletions src/directives.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
});
}
};
};
}
Expand Down
41 changes: 40 additions & 1 deletion test/directivesSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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');
});
});


Expand Down