(name, selector)
| 18341 | }]; |
| 18342 | |
| 18343 | function classDirective(name, selector) { |
| 18344 | name = 'ngClass' + name; |
| 18345 | return ['$animate', function($animate) { |
| 18346 | return { |
| 18347 | restrict: 'AC', |
| 18348 | link: function(scope, element, attr) { |
| 18349 | var oldVal; |
| 18350 | |
| 18351 | scope.$watch(attr[name], ngClassWatchAction, true); |
| 18352 | |
| 18353 | attr.$observe('class', function(value) { |
| 18354 | ngClassWatchAction(scope.$eval(attr[name])); |
| 18355 | }); |
| 18356 | |
| 18357 | |
| 18358 | if (name !== 'ngClass') { |
| 18359 | scope.$watch('$index', function($index, old$index) { |
| 18360 | // jshint bitwise: false |
| 18361 | var mod = $index & 1; |
| 18362 | if (mod !== (old$index & 1)) { |
| 18363 | var classes = arrayClasses(scope.$eval(attr[name])); |
| 18364 | mod === selector ? |
| 18365 | addClasses(classes) : |
| 18366 | removeClasses(classes); |
| 18367 | } |
| 18368 | }); |
| 18369 | } |
| 18370 | |
| 18371 | function addClasses(classes) { |
| 18372 | var newClasses = digestClassCounts(classes, 1); |
| 18373 | attr.$addClass(newClasses); |
| 18374 | } |
| 18375 | |
| 18376 | function removeClasses(classes) { |
| 18377 | var newClasses = digestClassCounts(classes, -1); |
| 18378 | attr.$removeClass(newClasses); |
| 18379 | } |
| 18380 | |
| 18381 | function digestClassCounts (classes, count) { |
| 18382 | var classCounts = element.data('$classCounts') || {}; |
| 18383 | var classesToUpdate = []; |
| 18384 | forEach(classes, function (className) { |
| 18385 | if (count > 0 || classCounts[className]) { |
| 18386 | classCounts[className] = (classCounts[className] || 0) + count; |
| 18387 | if (classCounts[className] === +(count > 0)) { |
| 18388 | classesToUpdate.push(className); |
| 18389 | } |
| 18390 | } |
| 18391 | }); |
| 18392 | element.data('$classCounts', classCounts); |
| 18393 | return classesToUpdate.join(' '); |
| 18394 | } |
| 18395 | |
| 18396 | function updateClasses (oldClasses, newClasses) { |
| 18397 | var toAdd = arrayDifference(newClasses, oldClasses); |
| 18398 | var toRemove = arrayDifference(oldClasses, newClasses); |
| 18399 | toRemove = digestClassCounts(toRemove, -1); |
| 18400 | toAdd = digestClassCounts(toAdd, 1); |
no test coverage detected