mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-04-10 10:01:00 +00:00
fix(ngClass): keep track of old ngClass value manually
ngClassWatchAction, when called as a $watch function, gets the wrong old value after it has been invoked previously due to observation of the interpolated class attribute. As a result it doesn't remove classes properly. Keeping track of the old value manually seems to fix this. Closes #1637
This commit is contained in:
parent
791804bdbf
commit
5f5d4feadb
2 changed files with 14 additions and 1 deletions
|
|
@ -3,6 +3,7 @@
|
||||||
function classDirective(name, selector) {
|
function classDirective(name, selector) {
|
||||||
name = 'ngClass' + name;
|
name = 'ngClass' + name;
|
||||||
return ngDirective(function(scope, element, attr) {
|
return ngDirective(function(scope, element, attr) {
|
||||||
|
var oldVal = undefined;
|
||||||
|
|
||||||
scope.$watch(attr[name], ngClassWatchAction, true);
|
scope.$watch(attr[name], ngClassWatchAction, true);
|
||||||
|
|
||||||
|
|
@ -26,13 +27,14 @@ function classDirective(name, selector) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function ngClassWatchAction(newVal, oldVal) {
|
function ngClassWatchAction(newVal) {
|
||||||
if (selector === true || scope.$index % 2 === selector) {
|
if (selector === true || scope.$index % 2 === selector) {
|
||||||
if (oldVal && (newVal !== oldVal)) {
|
if (oldVal && (newVal !== oldVal)) {
|
||||||
removeClass(oldVal);
|
removeClass(oldVal);
|
||||||
}
|
}
|
||||||
addClass(newVal);
|
addClass(newVal);
|
||||||
}
|
}
|
||||||
|
oldVal = newVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -236,6 +236,17 @@ describe('ngClass', function() {
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|
||||||
|
it('should not mess up class value due to observing an interpolated class attribute', inject(function($rootScope, $compile) {
|
||||||
|
$rootScope.foo = true;
|
||||||
|
$rootScope.$watch("anything", function() {
|
||||||
|
$rootScope.foo = false;
|
||||||
|
});
|
||||||
|
element = $compile('<div ng-class="{foo:foo}"></div>')($rootScope);
|
||||||
|
$rootScope.$digest();
|
||||||
|
expect(element.hasClass('foo')).toBe(false);
|
||||||
|
}));
|
||||||
|
|
||||||
|
|
||||||
it('should update ngClassOdd/Even when model is changed by filtering', inject(function($rootScope, $compile) {
|
it('should update ngClassOdd/Even when model is changed by filtering', inject(function($rootScope, $compile) {
|
||||||
element = $compile('<ul>' +
|
element = $compile('<ul>' +
|
||||||
'<li ng-repeat="i in items" ' +
|
'<li ng-repeat="i in items" ' +
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue