(name, selector)
| 18283 | }]; |
| 18284 | |
| 18285 | function classDirective(name, selector) { |
| 18286 | name = 'ngClass' + name; |
| 18287 | return ['$animate', function($animate) { |
| 18288 | return { |
| 18289 | restrict: 'AC', |
| 18290 | link: function(scope, element, attr) { |
| 18291 | var oldVal; |
| 18292 | |
| 18293 | scope.$watch(attr[name], ngClassWatchAction, true); |
| 18294 | |
| 18295 | attr.$observe('class', function(value) { |
| 18296 | ngClassWatchAction(scope.$eval(attr[name])); |
| 18297 | }); |
| 18298 | |
| 18299 | |
| 18300 | if (name !== 'ngClass') { |
| 18301 | scope.$watch('$index', function($index, old$index) { |
| 18302 | // jshint bitwise: false |
| 18303 | var mod = $index & 1; |
| 18304 | if (mod !== (old$index & 1)) { |
| 18305 | var classes = arrayClasses(scope.$eval(attr[name])); |
| 18306 | mod === selector ? |
| 18307 | addClasses(classes) : |
| 18308 | removeClasses(classes); |
| 18309 | } |
| 18310 | }); |
| 18311 | } |
| 18312 | |
| 18313 | function addClasses(classes) { |
| 18314 | var newClasses = digestClassCounts(classes, 1); |
| 18315 | attr.$addClass(newClasses); |
| 18316 | } |
| 18317 | |
| 18318 | function removeClasses(classes) { |
| 18319 | var newClasses = digestClassCounts(classes, -1); |
| 18320 | attr.$removeClass(newClasses); |
| 18321 | } |
| 18322 | |
| 18323 | function digestClassCounts (classes, count) { |
| 18324 | var classCounts = element.data('$classCounts') || {}; |
| 18325 | var classesToUpdate = []; |
| 18326 | forEach(classes, function (className) { |
| 18327 | if (count > 0 || classCounts[className]) { |
| 18328 | classCounts[className] = (classCounts[className] || 0) + count; |
| 18329 | if (classCounts[className] === +(count > 0)) { |
| 18330 | classesToUpdate.push(className); |
| 18331 | } |
| 18332 | } |
| 18333 | }); |
| 18334 | element.data('$classCounts', classCounts); |
| 18335 | return classesToUpdate.join(' '); |
| 18336 | } |
| 18337 | |
| 18338 | function updateClasses (oldClasses, newClasses) { |
| 18339 | var toAdd = arrayDifference(newClasses, oldClasses); |
| 18340 | var toRemove = arrayDifference(oldClasses, newClasses); |
| 18341 | toRemove = digestClassCounts(toRemove, -1); |
| 18342 | toAdd = digestClassCounts(toAdd, 1); |
no test coverage detected