(name, selector)
| 27839 | */ |
| 27840 | |
| 27841 | function classDirective(name, selector) { |
| 27842 | name = 'ngClass' + name; |
| 27843 | var indexWatchExpression; |
| 27844 | |
| 27845 | return ['$parse', function($parse) { |
| 27846 | return { |
| 27847 | restrict: 'AC', |
| 27848 | link: function(scope, element, attr) { |
| 27849 | var classCounts = element.data('$classCounts'); |
| 27850 | var oldModulo = true; |
| 27851 | var oldClassString; |
| 27852 | |
| 27853 | if (!classCounts) { |
| 27854 | // Use createMap() to prevent class assumptions involving property |
| 27855 | // names in Object.prototype |
| 27856 | classCounts = createMap(); |
| 27857 | element.data('$classCounts', classCounts); |
| 27858 | } |
| 27859 | |
| 27860 | if (name !== 'ngClass') { |
| 27861 | if (!indexWatchExpression) { |
| 27862 | indexWatchExpression = $parse('$index', function moduloTwo($index) { |
| 27863 | // eslint-disable-next-line no-bitwise |
| 27864 | return $index & 1; |
| 27865 | }); |
| 27866 | } |
| 27867 | |
| 27868 | scope.$watch(indexWatchExpression, ngClassIndexWatchAction); |
| 27869 | } |
| 27870 | |
| 27871 | scope.$watch($parse(attr[name], toClassString), ngClassWatchAction); |
| 27872 | |
| 27873 | function addClasses(classString) { |
| 27874 | classString = digestClassCounts(split(classString), 1); |
| 27875 | attr.$addClass(classString); |
| 27876 | } |
| 27877 | |
| 27878 | function removeClasses(classString) { |
| 27879 | classString = digestClassCounts(split(classString), -1); |
| 27880 | attr.$removeClass(classString); |
| 27881 | } |
| 27882 | |
| 27883 | function updateClasses(oldClassString, newClassString) { |
| 27884 | var oldClassArray = split(oldClassString); |
| 27885 | var newClassArray = split(newClassString); |
| 27886 | |
| 27887 | var toRemoveArray = arrayDifference(oldClassArray, newClassArray); |
| 27888 | var toAddArray = arrayDifference(newClassArray, oldClassArray); |
| 27889 | |
| 27890 | var toRemoveString = digestClassCounts(toRemoveArray, -1); |
| 27891 | var toAddString = digestClassCounts(toAddArray, 1); |
| 27892 | |
| 27893 | attr.$addClass(toAddString); |
| 27894 | attr.$removeClass(toRemoveString); |
| 27895 | } |
| 27896 | |
| 27897 | function digestClassCounts(classArray, count) { |
| 27898 | var classesToUpdate = []; |
no test coverage detected