(name, selector)
| 22013 | }]; |
| 22014 | |
| 22015 | function classDirective(name, selector) { |
| 22016 | name = 'ngClass' + name; |
| 22017 | return ['$animate', function($animate) { |
| 22018 | return { |
| 22019 | restrict: 'AC', |
| 22020 | link: function(scope, element, attr) { |
| 22021 | var oldVal; |
| 22022 | |
| 22023 | scope.$watch(attr[name], ngClassWatchAction, true); |
| 22024 | |
| 22025 | attr.$observe('class', function(value) { |
| 22026 | ngClassWatchAction(scope.$eval(attr[name])); |
| 22027 | }); |
| 22028 | |
| 22029 | |
| 22030 | if (name !== 'ngClass') { |
| 22031 | scope.$watch('$index', function($index, old$index) { |
| 22032 | // jshint bitwise: false |
| 22033 | var mod = $index & 1; |
| 22034 | if (mod !== (old$index & 1)) { |
| 22035 | var classes = arrayClasses(scope.$eval(attr[name])); |
| 22036 | mod === selector ? |
| 22037 | addClasses(classes) : |
| 22038 | removeClasses(classes); |
| 22039 | } |
| 22040 | }); |
| 22041 | } |
| 22042 | |
| 22043 | function addClasses(classes) { |
| 22044 | var newClasses = digestClassCounts(classes, 1); |
| 22045 | attr.$addClass(newClasses); |
| 22046 | } |
| 22047 | |
| 22048 | function removeClasses(classes) { |
| 22049 | var newClasses = digestClassCounts(classes, -1); |
| 22050 | attr.$removeClass(newClasses); |
| 22051 | } |
| 22052 | |
| 22053 | function digestClassCounts(classes, count) { |
| 22054 | var classCounts = element.data('$classCounts') || {}; |
| 22055 | var classesToUpdate = []; |
| 22056 | forEach(classes, function(className) { |
| 22057 | if (count > 0 || classCounts[className]) { |
| 22058 | classCounts[className] = (classCounts[className] || 0) + count; |
| 22059 | if (classCounts[className] === +(count > 0)) { |
| 22060 | classesToUpdate.push(className); |
| 22061 | } |
| 22062 | } |
| 22063 | }); |
| 22064 | element.data('$classCounts', classCounts); |
| 22065 | return classesToUpdate.join(' '); |
| 22066 | } |
| 22067 | |
| 22068 | function updateClasses(oldClasses, newClasses) { |
| 22069 | var toAdd = arrayDifference(newClasses, oldClasses); |
| 22070 | var toRemove = arrayDifference(oldClasses, newClasses); |
| 22071 | toAdd = digestClassCounts(toAdd, 1); |
| 22072 | toRemove = digestClassCounts(toRemove, -1); |
no test coverage detected