(name, selector)
| 22595 | }); |
| 22596 | |
| 22597 | function classDirective(name, selector) { |
| 22598 | name = 'ngClass' + name; |
| 22599 | return ['$animate', function($animate) { |
| 22600 | return { |
| 22601 | restrict: 'AC', |
| 22602 | link: function(scope, element, attr) { |
| 22603 | var oldVal; |
| 22604 | |
| 22605 | scope.$watch(attr[name], ngClassWatchAction, true); |
| 22606 | |
| 22607 | attr.$observe('class', function(value) { |
| 22608 | ngClassWatchAction(scope.$eval(attr[name])); |
| 22609 | }); |
| 22610 | |
| 22611 | |
| 22612 | if (name !== 'ngClass') { |
| 22613 | scope.$watch('$index', function($index, old$index) { |
| 22614 | // jshint bitwise: false |
| 22615 | var mod = $index & 1; |
| 22616 | if (mod !== (old$index & 1)) { |
| 22617 | var classes = arrayClasses(scope.$eval(attr[name])); |
| 22618 | mod === selector ? |
| 22619 | addClasses(classes) : |
| 22620 | removeClasses(classes); |
| 22621 | } |
| 22622 | }); |
| 22623 | } |
| 22624 | |
| 22625 | function addClasses(classes) { |
| 22626 | var newClasses = digestClassCounts(classes, 1); |
| 22627 | attr.$addClass(newClasses); |
| 22628 | } |
| 22629 | |
| 22630 | function removeClasses(classes) { |
| 22631 | var newClasses = digestClassCounts(classes, -1); |
| 22632 | attr.$removeClass(newClasses); |
| 22633 | } |
| 22634 | |
| 22635 | function digestClassCounts(classes, count) { |
| 22636 | // Use createMap() to prevent class assumptions involving property |
| 22637 | // names in Object.prototype |
| 22638 | var classCounts = element.data('$classCounts') || createMap(); |
| 22639 | var classesToUpdate = []; |
| 22640 | forEach(classes, function(className) { |
| 22641 | if (count > 0 || classCounts[className]) { |
| 22642 | classCounts[className] = (classCounts[className] || 0) + count; |
| 22643 | if (classCounts[className] === +(count > 0)) { |
| 22644 | classesToUpdate.push(className); |
| 22645 | } |
| 22646 | } |
| 22647 | }); |
| 22648 | element.data('$classCounts', classCounts); |
| 22649 | return classesToUpdate.join(' '); |
| 22650 | } |
| 22651 | |
| 22652 | function updateClasses(oldClasses, newClasses) { |
| 22653 | var toAdd = arrayDifference(newClasses, oldClasses); |
| 22654 | var toRemove = arrayDifference(oldClasses, newClasses); |
no test coverage detected