Просмотр исходного кода

fix #490 multiple select value matching should use soft equal

Evan You 11 лет назад
Родитель
Сommit
aec1ecfb02
2 измененных файлов с 25 добавлено и 8 удалено
  1. 18 1
      src/directives/model/select.js
  2. 7 7
      test/unit/specs/directives/model_spec.js

+ 18 - 1
src/directives/model/select.js

@@ -34,7 +34,7 @@ module.exports = {
     while (i--) {
       option = options[i]
       option.selected = multi
-        ? value.indexOf(option.value) > -1
+        ? indexOf(value, option.value) > -1
         : value == option.value
     }
   },
@@ -147,4 +147,21 @@ function filterSelected (op) {
 
 function getOptionValue (op) {
   return op.value || op.text
+}
+
+/**
+ * Native Array.indexOf uses strict equal, but in this
+ * case we need to match string/numbers with soft equal.
+ *
+ * @param {Array} arr
+ * @param {*} val
+ */
+
+function indexOf (arr, val) {
+  /* jshint eqeqeq: false */
+  var i = arr.length
+  while (i--) {
+    if (arr[i] == val) return i
+  }
+  return -1
 }

+ 7 - 7
test/unit/specs/directives/model_spec.js

@@ -161,20 +161,20 @@ if (_.inBrowser) {
       var vm = new Vue({
         el: el,
         data: {
-          test: ['b']
+          test: [2] // test number soft equal
         },
         template:
           '<select v-model="test" multiple>' +
-            '<option>a</option>' +
-            '<option>b</option>' +
-            '<option>c</option>' +
+            '<option>1</option>' +
+            '<option>2</option>' +
+            '<option>3</option>' +
           '</select>'
       })
       var opts = el.firstChild.options
       expect(opts[0].selected).toBe(false)
       expect(opts[1].selected).toBe(true)
       expect(opts[2].selected).toBe(false)
-      vm.test = ['a', 'c']
+      vm.test = [1, '3'] // mix of number/string
       _.nextTick(function () {
         expect(opts[0].selected).toBe(true)
         expect(opts[1].selected).toBe(false)
@@ -182,8 +182,8 @@ if (_.inBrowser) {
         opts[0].selected = false
         opts[1].selected = true
         trigger(el.firstChild, 'change')
-        expect(vm.test[0]).toBe('b')
-        expect(vm.test[1]).toBe('c')
+        expect(vm.test[0]).toBe('2')
+        expect(vm.test[1]).toBe('3')
         done()
       })
     })