(name, selector)
| 25617 | */ |
| 25618 | |
| 25619 | function classDirective(name, selector) { |
| 25620 | name = 'ngClass' + name; |
| 25621 | return ['$animate', function($animate) { |
| 25622 | return { |
| 25623 | restrict: 'AC', |
| 25624 | link: function(scope, element, attr) { |
| 25625 | var oldVal; |
| 25626 | |
| 25627 | attr.$observe('class', function(value) { |
| 25628 | ngClassWatchAction(scope.$eval(attr[name])); |
| 25629 | }); |
| 25630 | |
| 25631 | |
| 25632 | if (name !== 'ngClass') { |
| 25633 | scope.$watch('$index', function($index, old$index) { |
| 25634 | /* eslint-disable no-bitwise */ |
| 25635 | var mod = $index & 1; |
| 25636 | if (mod !== (old$index & 1)) { |
| 25637 | var classes = arrayClasses(oldVal); |
| 25638 | if (mod === selector) { |
| 25639 | addClasses(classes); |
| 25640 | } else { |
| 25641 | removeClasses(classes); |
| 25642 | } |
| 25643 | } |
| 25644 | /* eslint-enable */ |
| 25645 | }); |
| 25646 | } |
| 25647 | |
| 25648 | scope.$watch(attr[name], ngClassWatchAction, true); |
| 25649 | |
| 25650 | function addClasses(classes) { |
| 25651 | var newClasses = digestClassCounts(classes, 1); |
| 25652 | attr.$addClass(newClasses); |
| 25653 | } |
| 25654 | |
| 25655 | function removeClasses(classes) { |
| 25656 | var newClasses = digestClassCounts(classes, -1); |
| 25657 | attr.$removeClass(newClasses); |
| 25658 | } |
| 25659 | |
| 25660 | function digestClassCounts(classes, count) { |
| 25661 | // Use createMap() to prevent class assumptions involving property |
| 25662 | // names in Object.prototype |
| 25663 | var classCounts = element.data('$classCounts') || createMap(); |
| 25664 | var classesToUpdate = []; |
| 25665 | forEach(classes, function(className) { |
| 25666 | if (count > 0 || classCounts[className]) { |
| 25667 | classCounts[className] = (classCounts[className] || 0) + count; |
| 25668 | if (classCounts[className] === +(count > 0)) { |
| 25669 | classesToUpdate.push(className); |
| 25670 | } |
| 25671 | } |
| 25672 | }); |
| 25673 | element.data('$classCounts', classCounts); |
| 25674 | return classesToUpdate.join(' '); |
| 25675 | } |
| 25676 |
no test coverage detected