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

Commit d528644

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

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
@@ -15,14 +15,12 @@ function classDirective(name, selector) {
1515
link: function(scope, element, attr) {
1616
var oldVal;
1717

18-
scope.$watch(attr[name], ngClassWatchAction, true);
19-
2018
if (name !== 'ngClass') {
2119
scope.$watch('$index', function($index, old$index) {
2220
/* eslint-disable no-bitwise */
2321
var mod = $index & 1;
2422
if (mod !== (old$index & 1)) {
25-
var classes = arrayClasses(scope.$eval(attr[name]));
23+
var classes = arrayClasses(oldVal);
2624
if (mod === selector) {
2725
addClasses(classes);
2826
} else {
@@ -33,6 +31,8 @@ function classDirective(name, selector) {
3331
});
3432
}
3533

34+
scope.$watch(attr[name], ngClassWatchAction, true);
35+
3636
function addClasses(classes) {
3737
var newClasses = digestClassCounts(classes, 1);
3838
attr.$addClass(newClasses);

test/ng/directive/ngClassSpec.js

+41
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,47 @@ describe('ngClass', function() {
461461
expect(e2.hasClass('odd')).toBeFalsy();
462462
}));
463463

464+
465+
it('should add/remove the correct classes when the expression and `$index` change simultaneously',
466+
inject(function($compile, $rootScope) {
467+
element = $compile(
468+
'<div>' +
469+
'<div ng-class-odd="foo"></div>' +
470+
'<div ng-class-even="foo"></div>' +
471+
'</div>')($rootScope);
472+
var odd = element.children().eq(0);
473+
var even = element.children().eq(1);
474+
475+
$rootScope.$apply('$index = 0; foo = "class1"');
476+
477+
expect(odd).toHaveClass('class1');
478+
expect(odd).not.toHaveClass('class2');
479+
expect(even).not.toHaveClass('class1');
480+
expect(even).not.toHaveClass('class2');
481+
482+
$rootScope.$apply('$index = 1; foo = "class2"');
483+
484+
expect(odd).not.toHaveClass('class1');
485+
expect(odd).not.toHaveClass('class2');
486+
expect(even).not.toHaveClass('class1');
487+
expect(even).toHaveClass('class2');
488+
489+
$rootScope.$apply('foo = "class1"');
490+
491+
expect(odd).not.toHaveClass('class1');
492+
expect(odd).not.toHaveClass('class2');
493+
expect(even).toHaveClass('class1');
494+
expect(even).not.toHaveClass('class2');
495+
496+
$rootScope.$apply('$index = 2');
497+
498+
expect(odd).toHaveClass('class1');
499+
expect(odd).not.toHaveClass('class2');
500+
expect(even).not.toHaveClass('class1');
501+
expect(even).not.toHaveClass('class2');
502+
})
503+
);
504+
464505
it('should support mixed array/object variable with a mutating object',
465506
inject(function($rootScope, $compile) {
466507
element = $compile('<div ng-class="classVar"></div>')($rootScope);

0 commit comments

Comments
 (0)