Pārlūkot izejas kodu

avoid triggering select reset when selectedIndex has not changed (fix #3504)

Evan You 9 gadi atpakaļ
vecāks
revīzija
0674509193
1 mainītis faili ar 14 papildinājumiem un 7 dzēšanām
  1. 14 7
      src/platforms/web/runtime/directives/model.js

+ 14 - 7
src/platforms/web/runtime/directives/model.js

@@ -64,9 +64,7 @@ export default {
 function setSelected (el, binding, vm) {
   const value = binding.value
   const isMultiple = el.multiple
-  if (!isMultiple) {
-    el.selectedIndex = -1
-  } else if (!Array.isArray(value)) {
+  if (isMultiple && !Array.isArray(value)) {
     process.env.NODE_ENV !== 'production' && warn(
       `<select multiple v-model="${binding.expression}"> ` +
       `expects an Array value for its binding, but got ${
@@ -76,17 +74,26 @@ function setSelected (el, binding, vm) {
     )
     return
   }
+  let selected, option
   for (let i = 0, l = el.options.length; i < l; i++) {
-    const option = el.options[i]
+    option = el.options[i]
     if (isMultiple) {
-      option.selected = value.indexOf(getValue(option)) > -1
+      selected = value.indexOf(getValue(option)) > -1
+      if (option.selected !== selected) {
+        option.selected = selected
+      }
     } else {
       if (getValue(option) === value) {
-        el.selectedIndex = i
-        break
+        if (el.selectedIndex !== i) {
+          el.selectedIndex = i
+        }
+        return
       }
     }
   }
+  if (!isMultiple) {
+    el.selectedIndex = -1
+  }
 }
 
 function hasNoMatchingOption (value, options) {