2
2
3
3
function classDirective ( name , selector ) {
4
4
name = 'ngClass' + name ;
5
- return function ( ) {
5
+ return [ '$animate' , function ( $animate ) {
6
6
return {
7
7
restrict : 'AC' ,
8
8
link : function ( scope , element , attr ) {
@@ -20,46 +20,100 @@ function classDirective(name, selector) {
20
20
// jshint bitwise: false
21
21
var mod = $index & 1 ;
22
22
if ( mod !== old$index & 1 ) {
23
- var classes = flattenClasses ( scope . $eval ( attr [ name ] ) ) ;
23
+ var classes = arrayClasses ( scope . $eval ( attr [ name ] ) ) ;
24
24
mod === selector ?
25
- attr . $addClass ( classes ) :
26
- attr . $removeClass ( classes ) ;
25
+ addClasses ( classes ) :
26
+ removeClasses ( classes ) ;
27
27
}
28
28
} ) ;
29
29
}
30
30
31
+ function addClasses ( classes ) {
32
+ var newClasses = digestClassCounts ( classes , 1 ) ;
33
+ attr . $addClass ( newClasses ) ;
34
+ }
35
+
36
+ function removeClasses ( classes ) {
37
+ var newClasses = digestClassCounts ( classes , - 1 ) ;
38
+ attr . $removeClass ( newClasses ) ;
39
+ }
40
+
41
+ function digestClassCounts ( classes , count ) {
42
+ var classCounts = element . data ( '$classCounts' ) || { } ;
43
+ var classesToUpdate = [ ] ;
44
+ forEach ( classes , function ( className ) {
45
+ if ( count > 0 || classCounts [ className ] ) {
46
+ classCounts [ className ] = ( classCounts [ className ] || 0 ) + count ;
47
+ if ( classCounts [ className ] === + ( count > 0 ) ) {
48
+ classesToUpdate . push ( className ) ;
49
+ }
50
+ }
51
+ } ) ;
52
+ element . data ( '$classCounts' , classCounts ) ;
53
+ return classesToUpdate . join ( ' ' ) ;
54
+ }
55
+
56
+ function updateClasses ( oldClasses , newClasses ) {
57
+ var toAdd = arrayDifference ( newClasses , oldClasses ) ;
58
+ var toRemove = arrayDifference ( oldClasses , newClasses ) ;
59
+ toRemove = digestClassCounts ( toRemove , - 1 ) ;
60
+ toAdd = digestClassCounts ( toAdd , 1 ) ;
61
+
62
+ if ( toAdd . length === 0 ) {
63
+ $animate . removeClass ( element , toRemove ) ;
64
+ } else if ( toRemove . length === 0 ) {
65
+ $animate . addClass ( element , toAdd ) ;
66
+ } else {
67
+ $animate . setClass ( element , toAdd , toRemove ) ;
68
+ }
69
+ }
31
70
32
71
function ngClassWatchAction ( newVal ) {
33
72
if ( selector === true || scope . $index % 2 === selector ) {
34
- var newClasses = flattenClasses ( newVal || '' ) ;
35
- if ( ! oldVal ) {
36
- attr . $addClass ( newClasses ) ;
37
- } else if ( ! equals ( newVal , oldVal ) ) {
38
- attr . $updateClass ( newClasses , flattenClasses ( oldVal ) ) ;
73
+ var newClasses = arrayClasses ( newVal || [ ] ) ;
74
+ if ( ! oldVal ) {
75
+ addClasses ( newClasses ) ;
76
+ } else if ( ! equals ( newVal , oldVal ) ) {
77
+ var oldClasses = arrayClasses ( oldVal ) ;
78
+ updateClasses ( oldClasses , newClasses ) ;
39
79
}
40
80
}
41
81
oldVal = copy ( newVal ) ;
42
82
}
83
+ }
84
+ } ;
43
85
86
+ function arrayDifference ( tokens1 , tokens2 ) {
87
+ var values = [ ] ;
44
88
45
- function flattenClasses ( classVal ) {
46
- if ( isArray ( classVal ) ) {
47
- return classVal . join ( ' ' ) ;
48
- } else if ( isObject ( classVal ) ) {
49
- var classes = [ ] , i = 0 ;
50
- forEach ( classVal , function ( v , k ) {
51
- if ( v ) {
52
- classes . push ( k ) ;
53
- }
54
- } ) ;
55
- return classes . join ( ' ' ) ;
56
- }
57
-
58
- return classVal ;
89
+ outer:
90
+ for ( var i = 0 ; i < tokens1 . length ; i ++ ) {
91
+ var token = tokens1 [ i ] ;
92
+ for ( var j = 0 ; j < tokens2 . length ; j ++ ) {
93
+ if ( token == tokens2 [ j ] ) continue outer;
59
94
}
95
+ values . push ( token ) ;
60
96
}
61
- } ;
62
- } ;
97
+ return values ;
98
+ }
99
+
100
+ function arrayClasses ( classVal ) {
101
+ if ( isArray ( classVal ) ) {
102
+ return classVal ;
103
+ } else if ( isString ( classVal ) ) {
104
+ return classVal . split ( ' ' ) ;
105
+ } else if ( isObject ( classVal ) ) {
106
+ var classes = [ ] , i = 0 ;
107
+ forEach ( classVal , function ( v , k ) {
108
+ if ( v ) {
109
+ classes . push ( k ) ;
110
+ }
111
+ } ) ;
112
+ return classes ;
113
+ }
114
+ return classVal ;
115
+ }
116
+ } ] ;
63
117
}
64
118
65
119
/**
0 commit comments