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

Commit 0ba4be6

Browse files
committed
fix(ngClassOdd/Even): keep track of classes even if odd/even do not match index
1 parent 2705085 commit 0ba4be6

File tree

2 files changed

+44
-3
lines changed

2 files changed

+44
-3
lines changed

src/ng/directive/ngClass.js

Lines changed: 3 additions & 3 deletions
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

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,47 @@ fdescribe('ngClass', function() {
462462
expect(e2.hasClass('odd')).toBeFalsy();
463463
}));
464464

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

0 commit comments

Comments
 (0)