(name, selector)
| 26960 | */ |
| 26961 | |
| 26962 | function classDirective(name, selector) { |
| 26963 | name = 'ngClass' + name; |
| 26964 | var indexWatchExpression; |
| 26965 | |
| 26966 | return ['$parse', function($parse) { |
| 26967 | return { |
| 26968 | restrict: 'AC', |
| 26969 | link: function(scope, element, attr) { |
| 26970 | var classCounts = element.data('$classCounts'); |
| 26971 | var oldModulo = true; |
| 26972 | var oldClassString; |
| 26973 | |
| 26974 | if (!classCounts) { |
| 26975 | // Use createMap() to prevent class assumptions involving property |
| 26976 | // names in Object.prototype |
| 26977 | classCounts = createMap(); |
| 26978 | element.data('$classCounts', classCounts); |
| 26979 | } |
| 26980 | |
| 26981 | if (name !== 'ngClass') { |
| 26982 | if (!indexWatchExpression) { |
| 26983 | indexWatchExpression = $parse('$index', function moduloTwo($index) { |
| 26984 | // eslint-disable-next-line no-bitwise |
| 26985 | return $index & 1; |
| 26986 | }); |
| 26987 | } |
| 26988 | |
| 26989 | scope.$watch(indexWatchExpression, ngClassIndexWatchAction); |
| 26990 | } |
| 26991 | |
| 26992 | scope.$watch($parse(attr[name], toClassString), ngClassWatchAction); |
| 26993 | |
| 26994 | function addClasses(classString) { |
| 26995 | classString = digestClassCounts(split(classString), 1); |
| 26996 | attr.$addClass(classString); |
| 26997 | } |
| 26998 | |
| 26999 | function removeClasses(classString) { |
| 27000 | classString = digestClassCounts(split(classString), -1); |
| 27001 | attr.$removeClass(classString); |
| 27002 | } |
| 27003 | |
| 27004 | function updateClasses(oldClassString, newClassString) { |
| 27005 | var oldClassArray = split(oldClassString); |
| 27006 | var newClassArray = split(newClassString); |
| 27007 | |
| 27008 | var toRemoveArray = arrayDifference(oldClassArray, newClassArray); |
| 27009 | var toAddArray = arrayDifference(newClassArray, oldClassArray); |
| 27010 | |
| 27011 | var toRemoveString = digestClassCounts(toRemoveArray, -1); |
| 27012 | var toAddString = digestClassCounts(toAddArray, 1); |
| 27013 | |
| 27014 | attr.$addClass(toAddString); |
| 27015 | attr.$removeClass(toRemoveString); |
| 27016 | } |
| 27017 | |
| 27018 | function digestClassCounts(classArray, count) { |
| 27019 | var classesToUpdate = []; |
no test coverage detected