(name, selector)
| 22373 | }); |
| 22374 | |
| 22375 | function classDirective(name, selector) { |
| 22376 | name = 'ngClass' + name; |
| 22377 | return ['$animate', function($animate) { |
| 22378 | return { |
| 22379 | restrict: 'AC', |
| 22380 | link: function(scope, element, attr) { |
| 22381 | var oldVal; |
| 22382 | |
| 22383 | scope.$watch(attr[name], ngClassWatchAction, true); |
| 22384 | |
| 22385 | attr.$observe('class', function(value) { |
| 22386 | ngClassWatchAction(scope.$eval(attr[name])); |
| 22387 | }); |
| 22388 | |
| 22389 | |
| 22390 | if (name !== 'ngClass') { |
| 22391 | scope.$watch('$index', function($index, old$index) { |
| 22392 | // jshint bitwise: false |
| 22393 | var mod = $index & 1; |
| 22394 | if (mod !== (old$index & 1)) { |
| 22395 | var classes = arrayClasses(scope.$eval(attr[name])); |
| 22396 | mod === selector ? |
| 22397 | addClasses(classes) : |
| 22398 | removeClasses(classes); |
| 22399 | } |
| 22400 | }); |
| 22401 | } |
| 22402 | |
| 22403 | function addClasses(classes) { |
| 22404 | var newClasses = digestClassCounts(classes, 1); |
| 22405 | attr.$addClass(newClasses); |
| 22406 | } |
| 22407 | |
| 22408 | function removeClasses(classes) { |
| 22409 | var newClasses = digestClassCounts(classes, -1); |
| 22410 | attr.$removeClass(newClasses); |
| 22411 | } |
| 22412 | |
| 22413 | function digestClassCounts(classes, count) { |
| 22414 | // Use createMap() to prevent class assumptions involving property |
| 22415 | // names in Object.prototype |
| 22416 | var classCounts = element.data('$classCounts') || createMap(); |
| 22417 | var classesToUpdate = []; |
| 22418 | forEach(classes, function(className) { |
| 22419 | if (count > 0 || classCounts[className]) { |
| 22420 | classCounts[className] = (classCounts[className] || 0) + count; |
| 22421 | if (classCounts[className] === +(count > 0)) { |
| 22422 | classesToUpdate.push(className); |
| 22423 | } |
| 22424 | } |
| 22425 | }); |
| 22426 | element.data('$classCounts', classCounts); |
| 22427 | return classesToUpdate.join(' '); |
| 22428 | } |
| 22429 | |
| 22430 | function updateClasses(oldClasses, newClasses) { |
| 22431 | var toAdd = arrayDifference(newClasses, oldClasses); |
| 22432 | var toRemove = arrayDifference(oldClasses, newClasses); |
no test coverage detected