Skip to content

Commit aec1ecf

Browse files
committed
fix #490 multiple select value matching should use soft equal
1 parent ae4584b commit aec1ecf

File tree

2 files changed

+25
-8
lines changed

2 files changed

+25
-8
lines changed

src/directives/model/select.js

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ module.exports = {
3434
while (i--) {
3535
option = options[i]
3636
option.selected = multi
37-
? value.indexOf(option.value) > -1
37+
? indexOf(value, option.value) > -1
3838
: value == option.value
3939
}
4040
},
@@ -147,4 +147,21 @@ function filterSelected (op) {
147147

148148
function getOptionValue (op) {
149149
return op.value || op.text
150+
}
151+
152+
/**
153+
* Native Array.indexOf uses strict equal, but in this
154+
* case we need to match string/numbers with soft equal.
155+
*
156+
* @param {Array} arr
157+
* @param {*} val
158+
*/
159+
160+
function indexOf (arr, val) {
161+
/* jshint eqeqeq: false */
162+
var i = arr.length
163+
while (i--) {
164+
if (arr[i] == val) return i
165+
}
166+
return -1
150167
}

test/unit/specs/directives/model_spec.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -161,29 +161,29 @@ if (_.inBrowser) {
161161
var vm = new Vue({
162162
el: el,
163163
data: {
164-
test: ['b']
164+
test: [2] // test number soft equal
165165
},
166166
template:
167167
'<select v-model="test" multiple>' +
168-
'<option>a</option>' +
169-
'<option>b</option>' +
170-
'<option>c</option>' +
168+
'<option>1</option>' +
169+
'<option>2</option>' +
170+
'<option>3</option>' +
171171
'</select>'
172172
})
173173
var opts = el.firstChild.options
174174
expect(opts[0].selected).toBe(false)
175175
expect(opts[1].selected).toBe(true)
176176
expect(opts[2].selected).toBe(false)
177-
vm.test = ['a', 'c']
177+
vm.test = [1, '3'] // mix of number/string
178178
_.nextTick(function () {
179179
expect(opts[0].selected).toBe(true)
180180
expect(opts[1].selected).toBe(false)
181181
expect(opts[2].selected).toBe(true)
182182
opts[0].selected = false
183183
opts[1].selected = true
184184
trigger(el.firstChild, 'change')
185-
expect(vm.test[0]).toBe('b')
186-
expect(vm.test[1]).toBe('c')
185+
expect(vm.test[0]).toBe('2')
186+
expect(vm.test[1]).toBe('3')
187187
done()
188188
})
189189
})

0 commit comments

Comments
 (0)