(name, selector)
| 23145 | }); |
| 23146 | |
| 23147 | function classDirective(name, selector) { |
| 23148 | name = 'ngClass' + name; |
| 23149 | return ['$animate', function($animate) { |
| 23150 | return { |
| 23151 | restrict: 'AC', |
| 23152 | link: function(scope, element, attr) { |
| 23153 | var oldVal; |
| 23154 | |
| 23155 | scope.$watch(attr[name], ngClassWatchAction, true); |
| 23156 | |
| 23157 | attr.$observe('class', function(value) { |
| 23158 | ngClassWatchAction(scope.$eval(attr[name])); |
| 23159 | }); |
| 23160 | |
| 23161 | |
| 23162 | if (name !== 'ngClass') { |
| 23163 | scope.$watch('$index', function($index, old$index) { |
| 23164 | // jshint bitwise: false |
| 23165 | var mod = $index & 1; |
| 23166 | if (mod !== (old$index & 1)) { |
| 23167 | var classes = arrayClasses(scope.$eval(attr[name])); |
| 23168 | mod === selector ? |
| 23169 | addClasses(classes) : |
| 23170 | removeClasses(classes); |
| 23171 | } |
| 23172 | }); |
| 23173 | } |
| 23174 | |
| 23175 | function addClasses(classes) { |
| 23176 | var newClasses = digestClassCounts(classes, 1); |
| 23177 | attr.$addClass(newClasses); |
| 23178 | } |
| 23179 | |
| 23180 | function removeClasses(classes) { |
| 23181 | var newClasses = digestClassCounts(classes, -1); |
| 23182 | attr.$removeClass(newClasses); |
| 23183 | } |
| 23184 | |
| 23185 | function digestClassCounts(classes, count) { |
| 23186 | // Use createMap() to prevent class assumptions involving property |
| 23187 | // names in Object.prototype |
| 23188 | var classCounts = element.data('$classCounts') || createMap(); |
| 23189 | var classesToUpdate = []; |
| 23190 | forEach(classes, function(className) { |
| 23191 | if (count > 0 || classCounts[className]) { |
| 23192 | classCounts[className] = (classCounts[className] || 0) + count; |
| 23193 | if (classCounts[className] === +(count > 0)) { |
| 23194 | classesToUpdate.push(className); |
| 23195 | } |
| 23196 | } |
| 23197 | }); |
| 23198 | element.data('$classCounts', classCounts); |
| 23199 | return classesToUpdate.join(' '); |
| 23200 | } |
| 23201 | |
| 23202 | function updateClasses(oldClasses, newClasses) { |
| 23203 | var toAdd = arrayDifference(newClasses, oldClasses); |
| 23204 | var toRemove = arrayDifference(oldClasses, newClasses); |
no test coverage detected