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

Commit e3d0207

Browse files
committed
fix(ngClassOdd/Even): add/remove the correct classes when expression/$index change simultaneously
1 parent a9708de commit e3d0207

File tree

2 files changed

+44
-3
lines changed

2 files changed

+44
-3
lines changed

src/ng/directive/ngClass.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ function classDirective(name, selector) {
1414
link: function(scope, element, attr) {
1515
var oldVal;
1616

17-
scope.$watch(attr[name], ngClassWatchAction, true);
18-
1917
attr.$observe('class', function(value) {
2018
ngClassWatchAction(scope.$eval(attr[name]));
2119
});
@@ -26,7 +24,7 @@ function classDirective(name, selector) {
2624
/* eslint-disable no-bitwise */
2725
var mod = $index & 1;
2826
if (mod !== (old$index & 1)) {
29-
var classes = arrayClasses(scope.$eval(attr[name]));
27+
var classes = arrayClasses(oldVal);
3028
if (mod === selector) {
3129
addClasses(classes);
3230
} else {
@@ -37,6 +35,8 @@ function classDirective(name, selector) {
3735
});
3836
}
3937

38+
scope.$watch(attr[name], ngClassWatchAction, true);
39+
4040
function addClasses(classes) {
4141
var newClasses = digestClassCounts(classes, 1);
4242
attr.$addClass(newClasses);

test/ng/directive/ngClassSpec.js

+41
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,47 @@ describe('ngClass', function() {
409409
expect(e2.hasClass('odd')).toBeFalsy();
410410
}));
411411

412+
413+
it('should add/remove the correct classes when the expression and `$index` change simultaneously',
414+
inject(function($compile, $rootScope) {
415+
element = $compile(
416+
'<div>' +
417+
'<div ng-class-odd="foo"></div>' +
418+
'<div ng-class-even="foo"></div>' +
419+
'</div>')($rootScope);
420+
var odd = element.children().eq(0);
421+
var even = element.children().eq(1);
422+
423+
$rootScope.$apply('$index = 0; foo = "class1"');
424+
425+
expect(odd).toHaveClass('class1');
426+
expect(odd).not.toHaveClass('class2');
427+
expect(even).not.toHaveClass('class1');
428+
expect(even).not.toHaveClass('class2');
429+
430+
$rootScope.$apply('$index = 1; foo = "class2"');
431+
432+
expect(odd).not.toHaveClass('class1');
433+
expect(odd).not.toHaveClass('class2');
434+
expect(even).not.toHaveClass('class1');
435+
expect(even).toHaveClass('class2');
436+
437+
$rootScope.$apply('foo = "class1"');
438+
439+
expect(odd).not.toHaveClass('class1');
440+
expect(odd).not.toHaveClass('class2');
441+
expect(even).toHaveClass('class1');
442+
expect(even).not.toHaveClass('class2');
443+
444+
$rootScope.$apply('$index = 2');
445+
446+
expect(odd).toHaveClass('class1');
447+
expect(odd).not.toHaveClass('class2');
448+
expect(even).not.toHaveClass('class1');
449+
expect(even).not.toHaveClass('class2');
450+
})
451+
);
452+
412453
it('should support mixed array/object variable with a mutating object',
413454
inject(function($rootScope, $compile) {
414455
element = $compile('<div ng-class="classVar"></div>')($rootScope);

0 commit comments

Comments
 (0)