(name, selector)
| 18536 | }]; |
| 18537 | |
| 18538 | function classDirective(name, selector) { |
| 18539 | name = 'ngClass' + name; |
| 18540 | return ['$animate', function($animate) { |
| 18541 | return { |
| 18542 | restrict: 'AC', |
| 18543 | link: function(scope, element, attr) { |
| 18544 | var oldVal; |
| 18545 | |
| 18546 | scope.$watch(attr[name], ngClassWatchAction, true); |
| 18547 | |
| 18548 | attr.$observe('class', function(value) { |
| 18549 | ngClassWatchAction(scope.$eval(attr[name])); |
| 18550 | }); |
| 18551 | |
| 18552 | |
| 18553 | if (name !== 'ngClass') { |
| 18554 | scope.$watch('$index', function($index, old$index) { |
| 18555 | // jshint bitwise: false |
| 18556 | var mod = $index & 1; |
| 18557 | if (mod !== (old$index & 1)) { |
| 18558 | var classes = arrayClasses(scope.$eval(attr[name])); |
| 18559 | mod === selector ? |
| 18560 | addClasses(classes) : |
| 18561 | removeClasses(classes); |
| 18562 | } |
| 18563 | }); |
| 18564 | } |
| 18565 | |
| 18566 | function addClasses(classes) { |
| 18567 | var newClasses = digestClassCounts(classes, 1); |
| 18568 | attr.$addClass(newClasses); |
| 18569 | } |
| 18570 | |
| 18571 | function removeClasses(classes) { |
| 18572 | var newClasses = digestClassCounts(classes, -1); |
| 18573 | attr.$removeClass(newClasses); |
| 18574 | } |
| 18575 | |
| 18576 | function digestClassCounts (classes, count) { |
| 18577 | var classCounts = element.data('$classCounts') || {}; |
| 18578 | var classesToUpdate = []; |
| 18579 | forEach(classes, function (className) { |
| 18580 | if (count > 0 || classCounts[className]) { |
| 18581 | classCounts[className] = (classCounts[className] || 0) + count; |
| 18582 | if (classCounts[className] === +(count > 0)) { |
| 18583 | classesToUpdate.push(className); |
| 18584 | } |
| 18585 | } |
| 18586 | }); |
| 18587 | element.data('$classCounts', classCounts); |
| 18588 | return classesToUpdate.join(' '); |
| 18589 | } |
| 18590 | |
| 18591 | function updateClasses (oldClasses, newClasses) { |
| 18592 | var toAdd = arrayDifference(newClasses, oldClasses); |
| 18593 | var toRemove = arrayDifference(oldClasses, newClasses); |
| 18594 | toRemove = digestClassCounts(toRemove, -1); |
| 18595 | toAdd = digestClassCounts(toAdd, 1); |
no test coverage detected