From f7d1d5fb0aa89512cf8085f0ff378f80ac8152f9 Mon Sep 17 00:00:00 2001 From: Declan Cook Date: Tue, 28 Oct 2014 10:24:04 +0000 Subject: [PATCH] fix(ngClass): remove classes already on the dom classes with an expression that evaluates to false but are already on the dom do not get removed. --- src/ng/directive/ngClass.js | 16 ++++++++++++++++ test/ng/directive/ngClassSpec.js | 8 ++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/ng/directive/ngClass.js b/src/ng/directive/ngClass.js index 665921b5f9e4..f16136a11021 100644 --- a/src/ng/directive/ngClass.js +++ b/src/ng/directive/ngClass.js @@ -66,10 +66,26 @@ function classDirective(name, selector) { } } + function removeFalseClasses(classVal) { + if (isArray(classVal) || isString(classVal)) { + return; + } + if (isObject(classVal)) { + var classes = [], i = 0; + forEach(classVal, function(v, k) { + if (!v) { + classes = classes.concat(k.split(' ')); + } + }); + attr.$removeClass(classes); + } + } + function ngClassWatchAction(newVal) { if (selector === true || scope.$index % 2 === selector) { var newClasses = arrayClasses(newVal || []); if (!oldVal) { + removeFalseClasses(newVal); addClasses(newClasses); } else if (!equals(newVal,oldVal)) { var oldClasses = arrayClasses(oldVal); diff --git a/test/ng/directive/ngClassSpec.js b/test/ng/directive/ngClassSpec.js index 9356efe62cbc..a2c0e6e272b3 100644 --- a/test/ng/directive/ngClassSpec.js +++ b/test/ng/directive/ngClassSpec.js @@ -45,8 +45,8 @@ describe('ngClass', function() { it('should support adding multiple classes conditionally via a map of class names to boolean ' + 'expressions', inject(function($rootScope, $compile) { element = $compile( - '
' + + '
' + '
')($rootScope); $rootScope.conditionA = true; $rootScope.$digest(); @@ -54,6 +54,8 @@ describe('ngClass', function() { expect(element.hasClass('A')).toBeTruthy(); expect(element.hasClass('B')).toBeFalsy(); expect(element.hasClass('AnotB')).toBeTruthy(); + expect(element.hasClass('existingTrue')).toBeTruthy(); + expect(element.hasClass('existingFalse')).toBeFalsy(); $rootScope.conditionB = function() { return true; }; $rootScope.$digest(); @@ -61,6 +63,8 @@ describe('ngClass', function() { expect(element.hasClass('A')).toBeTruthy(); expect(element.hasClass('B')).toBeTruthy(); expect(element.hasClass('AnotB')).toBeFalsy(); + expect(element.hasClass('existingTrue')).toBeTruthy(); + expect(element.hasClass('existingFalse')).toBeFalsy(); }));