(name, selector)
| 23592 | }); |
| 23593 | |
| 23594 | function classDirective(name, selector) { |
| 23595 | name = 'ngClass' + name; |
| 23596 | return ['$animate', function($animate) { |
| 23597 | return { |
| 23598 | restrict: 'AC', |
| 23599 | link: function(scope, element, attr) { |
| 23600 | var oldVal; |
| 23601 | |
| 23602 | scope.$watch(attr[name], ngClassWatchAction, true); |
| 23603 | |
| 23604 | attr.$observe('class', function(value) { |
| 23605 | ngClassWatchAction(scope.$eval(attr[name])); |
| 23606 | }); |
| 23607 | |
| 23608 | |
| 23609 | if (name !== 'ngClass') { |
| 23610 | scope.$watch('$index', function($index, old$index) { |
| 23611 | // jshint bitwise: false |
| 23612 | var mod = $index & 1; |
| 23613 | if (mod !== (old$index & 1)) { |
| 23614 | var classes = arrayClasses(scope.$eval(attr[name])); |
| 23615 | mod === selector ? |
| 23616 | addClasses(classes) : |
| 23617 | removeClasses(classes); |
| 23618 | } |
| 23619 | }); |
| 23620 | } |
| 23621 | |
| 23622 | function addClasses(classes) { |
| 23623 | var newClasses = digestClassCounts(classes, 1); |
| 23624 | attr.$addClass(newClasses); |
| 23625 | } |
| 23626 | |
| 23627 | function removeClasses(classes) { |
| 23628 | var newClasses = digestClassCounts(classes, -1); |
| 23629 | attr.$removeClass(newClasses); |
| 23630 | } |
| 23631 | |
| 23632 | function digestClassCounts(classes, count) { |
| 23633 | // Use createMap() to prevent class assumptions involving property |
| 23634 | // names in Object.prototype |
| 23635 | var classCounts = element.data('$classCounts') || createMap(); |
| 23636 | var classesToUpdate = []; |
| 23637 | forEach(classes, function(className) { |
| 23638 | if (count > 0 || classCounts[className]) { |
| 23639 | classCounts[className] = (classCounts[className] || 0) + count; |
| 23640 | if (classCounts[className] === +(count > 0)) { |
| 23641 | classesToUpdate.push(className); |
| 23642 | } |
| 23643 | } |
| 23644 | }); |
| 23645 | element.data('$classCounts', classCounts); |
| 23646 | return classesToUpdate.join(' '); |
| 23647 | } |
| 23648 | |
| 23649 | function updateClasses(oldClasses, newClasses) { |
| 23650 | var toAdd = arrayDifference(newClasses, oldClasses); |
| 23651 | var toRemove = arrayDifference(oldClasses, newClasses); |
no test coverage detected