(name, selector)
| 26805 | */ |
| 26806 | |
| 26807 | function classDirective(name, selector) { |
| 26808 | name = 'ngClass' + name; |
| 26809 | var indexWatchExpression; |
| 26810 | |
| 26811 | return ['$parse', function($parse) { |
| 26812 | return { |
| 26813 | restrict: 'AC', |
| 26814 | link: function(scope, element, attr) { |
| 26815 | var expression = attr[name].trim(); |
| 26816 | var isOneTime = (expression.charAt(0) === ':') && (expression.charAt(1) === ':'); |
| 26817 | |
| 26818 | var watchInterceptor = isOneTime ? toFlatValue : toClassString; |
| 26819 | var watchExpression = $parse(expression, watchInterceptor); |
| 26820 | var watchAction = isOneTime ? ngClassOneTimeWatchAction : ngClassWatchAction; |
| 26821 | |
| 26822 | var classCounts = element.data('$classCounts'); |
| 26823 | var oldModulo = true; |
| 26824 | var oldClassString; |
| 26825 | |
| 26826 | if (!classCounts) { |
| 26827 | // Use createMap() to prevent class assumptions involving property |
| 26828 | // names in Object.prototype |
| 26829 | classCounts = createMap(); |
| 26830 | element.data('$classCounts', classCounts); |
| 26831 | } |
| 26832 | |
| 26833 | if (name !== 'ngClass') { |
| 26834 | if (!indexWatchExpression) { |
| 26835 | indexWatchExpression = $parse('$index', function moduloTwo($index) { |
| 26836 | // eslint-disable-next-line no-bitwise |
| 26837 | return $index & 1; |
| 26838 | }); |
| 26839 | } |
| 26840 | |
| 26841 | scope.$watch(indexWatchExpression, ngClassIndexWatchAction); |
| 26842 | } |
| 26843 | |
| 26844 | scope.$watch(watchExpression, watchAction, isOneTime); |
| 26845 | |
| 26846 | function addClasses(classString) { |
| 26847 | classString = digestClassCounts(split(classString), 1); |
| 26848 | attr.$addClass(classString); |
| 26849 | } |
| 26850 | |
| 26851 | function removeClasses(classString) { |
| 26852 | classString = digestClassCounts(split(classString), -1); |
| 26853 | attr.$removeClass(classString); |
| 26854 | } |
| 26855 | |
| 26856 | function updateClasses(oldClassString, newClassString) { |
| 26857 | var oldClassArray = split(oldClassString); |
| 26858 | var newClassArray = split(newClassString); |
| 26859 | |
| 26860 | var toRemoveArray = arrayDifference(oldClassArray, newClassArray); |
| 26861 | var toAddArray = arrayDifference(newClassArray, oldClassArray); |
| 26862 | |
| 26863 | var toRemoveString = digestClassCounts(toRemoveArray, -1); |
| 26864 | var toAddString = digestClassCounts(toAddArray, 1); |
no test coverage detected