(name, selector)
| 26424 | */ |
| 26425 | |
| 26426 | function classDirective(name, selector) { |
| 26427 | name = 'ngClass' + name; |
| 26428 | var indexWatchExpression; |
| 26429 | |
| 26430 | return ['$parse', function($parse) { |
| 26431 | return { |
| 26432 | restrict: 'AC', |
| 26433 | link: function(scope, element, attr) { |
| 26434 | var expression = attr[name].trim(); |
| 26435 | var isOneTime = (expression.charAt(0) === ':') && (expression.charAt(1) === ':'); |
| 26436 | |
| 26437 | var watchInterceptor = isOneTime ? toFlatValue : toClassString; |
| 26438 | var watchExpression = $parse(expression, watchInterceptor); |
| 26439 | var watchAction = isOneTime ? ngClassOneTimeWatchAction : ngClassWatchAction; |
| 26440 | |
| 26441 | var classCounts = element.data('$classCounts'); |
| 26442 | var oldModulo = true; |
| 26443 | var oldClassString; |
| 26444 | |
| 26445 | if (!classCounts) { |
| 26446 | // Use createMap() to prevent class assumptions involving property |
| 26447 | // names in Object.prototype |
| 26448 | classCounts = createMap(); |
| 26449 | element.data('$classCounts', classCounts); |
| 26450 | } |
| 26451 | |
| 26452 | if (name !== 'ngClass') { |
| 26453 | if (!indexWatchExpression) { |
| 26454 | indexWatchExpression = $parse('$index', function moduloTwo($index) { |
| 26455 | // eslint-disable-next-line no-bitwise |
| 26456 | return $index & 1; |
| 26457 | }); |
| 26458 | } |
| 26459 | |
| 26460 | scope.$watch(indexWatchExpression, ngClassIndexWatchAction); |
| 26461 | } |
| 26462 | |
| 26463 | scope.$watch(watchExpression, watchAction, isOneTime); |
| 26464 | |
| 26465 | function addClasses(classString) { |
| 26466 | classString = digestClassCounts(split(classString), 1); |
| 26467 | attr.$addClass(classString); |
| 26468 | } |
| 26469 | |
| 26470 | function removeClasses(classString) { |
| 26471 | classString = digestClassCounts(split(classString), -1); |
| 26472 | attr.$removeClass(classString); |
| 26473 | } |
| 26474 | |
| 26475 | function updateClasses(oldClassString, newClassString) { |
| 26476 | var oldClassArray = split(oldClassString); |
| 26477 | var newClassArray = split(newClassString); |
| 26478 | |
| 26479 | var toRemoveArray = arrayDifference(oldClassArray, newClassArray); |
| 26480 | var toAddArray = arrayDifference(newClassArray, oldClassArray); |
| 26481 | |
| 26482 | var toRemoveString = digestClassCounts(toRemoveArray, -1); |
| 26483 | var toAddString = digestClassCounts(toAddArray, 1); |
no test coverage detected