Skip to content

Commit e8f4e70

Browse files
committed
:class array with objects
refactoring :class bindings for array with objects caching value in handleArray fixed return statements and cached value[i] updated tests for :class prevKeys blown away :class bindings with objects in array
1 parent 3b2038d commit e8f4e70

File tree

2 files changed

+39
-21
lines changed

2 files changed

+39
-21
lines changed

src/directives/internal/class.js

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ import {
22
addClass,
33
removeClass,
44
isArray,
5-
isPlainObject,
6-
hasOwn
5+
isPlainObject
76
} from '../../util/index'
87

98
export default {
@@ -24,22 +23,18 @@ export default {
2423

2524
handleObject (value) {
2625
this.cleanup(value)
27-
var keys = this.prevKeys = Object.keys(value)
28-
for (var i = 0, l = keys.length; i < l; i++) {
29-
var key = keys[i]
30-
if (value[key]) {
31-
addClass(this.el, key)
32-
} else {
33-
removeClass(this.el, key)
34-
}
35-
}
26+
this.prevKeys = Object.keys(value)
27+
setObjectClasses(this.el, value)
3628
},
3729

3830
handleArray (value) {
3931
this.cleanup(value)
4032
for (var i = 0, l = value.length; i < l; i++) {
41-
if (value[i]) {
42-
addClass(this.el, value[i])
33+
var val = value[i]
34+
if (val && isPlainObject(val)) {
35+
setObjectClasses(this.el, val)
36+
} else if (val && typeof val === 'string') {
37+
addClass(this.el, val)
4338
}
4439
}
4540
this.prevKeys = value.slice()
@@ -50,14 +45,30 @@ export default {
5045
var i = this.prevKeys.length
5146
while (i--) {
5247
var key = this.prevKeys[i]
53-
if (key && (!value || !contains(value, key))) {
48+
if (!key) continue
49+
if (isPlainObject(key)) {
50+
var keys = Object.keys(key)
51+
for (var k = 0; k < keys.length; k++) {
52+
removeClass(this.el, keys[k])
53+
}
54+
} else {
5455
removeClass(this.el, key)
5556
}
5657
}
5758
}
5859
}
5960
}
6061

62+
function setObjectClasses (el, obj) {
63+
var keys = Object.keys(obj)
64+
for (var i = 0, l = keys.length; i < l; i++) {
65+
var key = keys[i]
66+
if (obj[key]) {
67+
addClass(el, key)
68+
}
69+
}
70+
}
71+
6172
function stringToObject (value) {
6273
var res = {}
6374
var keys = value.trim().split(/\s+/)
@@ -67,9 +78,3 @@ function stringToObject (value) {
6778
}
6879
return res
6980
}
70-
71-
function contains (value, key) {
72-
return isArray(value)
73-
? value.indexOf(key) > -1
74-
: hasOwn(value, key)
75-
}

test/unit/specs/directives/internal/class_spec.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ describe(':class', function () {
4242
dir.update(['b', 'c'])
4343
expect(el.className).toBe('a b c')
4444
dir.update(['d', 'c'])
45-
expect(el.className).toBe('a c d')
45+
expect(el.className).toBe('a d c')
4646
dir.update()
4747
expect(el.className).toBe('a')
4848
// test mutating array
@@ -53,5 +53,18 @@ describe(':class', function () {
5353
arr.push('f')
5454
dir.update(arr)
5555
expect(el.className).toBe('a f')
56+
// test array with objects
57+
dir.update(['x', {y: true, z: true}])
58+
expect(el.className).toBe('a x y z')
59+
dir.update(['x', {y: true, z: false}])
60+
expect(el.className).toBe('a x y')
61+
dir.update(['f', {z: true}])
62+
expect(el.className).toBe('a f z')
63+
dir.update(['l', 'f', {n: true, z: true}])
64+
expect(el.className).toBe('a l f n z')
65+
dir.update(['x', {}])
66+
expect(el.className).toBe('a x')
67+
dir.update()
68+
expect(el.className).toBe('a')
5669
})
5770
})

0 commit comments

Comments
 (0)