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

Commit 2428907

Browse files
Di PengIgorMinar
Di Peng
authored andcommitted
fix(ng:class): preserve classes added post compilation
- make sure ng:class preserve classes added after compilation Closes #355
1 parent 8a8a2cf commit 2428907

File tree

2 files changed

+56
-10
lines changed

2 files changed

+56
-10
lines changed

src/directives.js

+16-9
Original file line numberDiff line numberDiff line change
@@ -568,18 +568,25 @@ angularDirective("ng:submit", function(expression, element) {
568568
});
569569
});
570570

571-
572571
function ngClass(selector) {
573572
return function(expression, element){
574-
var existing = element[0].className + ' ';
575573
return function(element){
576-
this.$onEval(function(){
577-
if (selector(this.$index)) {
578-
var value = this.$eval(expression);
579-
if (isArray(value)) value = value.join(' ');
580-
element[0].className = trim(existing + value);
581-
}
582-
}, element);
574+
if(selector(this.$index)) {
575+
this.$watch(expression, function(newCls, oldCls) {
576+
var cls = element.attr('class');
577+
if (isArray(newCls)) newCls = newCls.join(' ');
578+
if (isArray(oldCls)) oldCls = oldCls.join(' ');
579+
580+
// The time when newCls == oldCLs is when $watch just started
581+
if (newCls == oldCls) {
582+
cls += ' ' + newCls;
583+
} else {
584+
cls = cls.replace(' ' + oldCls, ' ' + newCls);
585+
}
586+
587+
element.attr('class', cls);
588+
});
589+
}
583590
};
584591
};
585592
}

test/directivesSpec.js

+40-1
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ describe("directive", function(){
177177

178178

179179
describe('ng:class', function() {
180-
it('should add new and remove old classes dynamically', function() {
180+
it('should change current class or remove old classes dynamically', function() {
181181
var scope = compile('<div class="existing" ng:class="dynClass"></div>');
182182
scope.dynClass = 'A';
183183
scope.$eval();
@@ -204,6 +204,45 @@ describe("directive", function(){
204204
expect(element.hasClass('A')).toBeTruthy();
205205
expect(element.hasClass('B')).toBeTruthy();
206206
});
207+
208+
it('should preserve class added post compilation', function() {
209+
var scope = compile('<div class="existing" ng:class="dynClass"></div>');
210+
scope.dynClass = 'A';
211+
scope.$eval();
212+
expect(element.hasClass('existing')).toBe(true);
213+
214+
// add extra class, change model and eval
215+
element.addClass('newClass');
216+
scope.dynClass = 'B';
217+
scope.$eval();
218+
219+
expect(element.hasClass('existing')).toBe(true);
220+
expect(element.hasClass('B')).toBe(true);
221+
expect(element.hasClass('newClass')).toBe(true);
222+
});
223+
224+
it('should preserve class added post compilation even without existing classes"', function() {
225+
var scope = compile('<div ng:class="dynClass"></div>');
226+
scope.dynClass = 'A';
227+
scope.$eval();
228+
expect(element.hasClass('A')).toBe(true);
229+
230+
// add extra class, change model and eval
231+
element.addClass('newClass');
232+
scope.dynClass = 'B';
233+
scope.$eval();
234+
235+
expect(element.hasClass('B')).toBe(true);
236+
expect(element.hasClass('newClass')).toBe(true);
237+
});
238+
239+
it('should preserve right classes"', function() {
240+
var scope = compile('<div class="ui-panel ui-selected" ng:class="dynCls"></div>');
241+
scope.dynCls = 'panel';
242+
scope.dynCls = 'foo';
243+
scope.$eval();
244+
expect(element.attr('class')).toBe('ui-panel ui-selected ng-directive foo');
245+
});
207246
});
208247

209248

0 commit comments

Comments
 (0)