Преглед изворни кода

fix(v-model) selected option not updated properly under IE11 (#6213)

fix #6209
JK пре 8 година
родитељ
комит
f40da5dbf2
1 измењених фајлова са 36 додато и 35 уклоњено
  1. 36 35
      src/platforms/web/runtime/directives/model.js

+ 36 - 35
src/platforms/web/runtime/directives/model.js

@@ -22,14 +22,7 @@ if (isIE9) {
 export default {
   inserted (el, binding, vnode) {
     if (vnode.tag === 'select') {
-      const cb = () => {
-        setSelected(el, binding, vnode.context)
-      }
-      cb()
-      /* istanbul ignore if */
-      if (isIE || isEdge) {
-        setTimeout(cb, 0)
-      }
+      setSelected(el, binding, vnode.context)
       el._vOptions = [].map.call(el.options, getValue)
     } else if (vnode.tag === 'textarea' || isTextInputType(el.type)) {
       el._vModifiers = binding.modifiers
@@ -67,37 +60,45 @@ export default {
 }
 
 function setSelected (el, binding, vm) {
-  const value = binding.value
-  const isMultiple = el.multiple
-  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 ${
-        Object.prototype.toString.call(value).slice(8, -1)
-      }`,
-      vm
-    )
-    return
-  }
-  let selected, option
-  for (let i = 0, l = el.options.length; i < l; i++) {
-    option = el.options[i]
-    if (isMultiple) {
-      selected = looseIndexOf(value, getValue(option)) > -1
-      if (option.selected !== selected) {
-        option.selected = selected
-      }
-    } else {
-      if (looseEqual(getValue(option), value)) {
-        if (el.selectedIndex !== i) {
-          el.selectedIndex = i
+  const cb = () => {
+    const value = binding.value
+    const isMultiple = el.multiple
+    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 ${
+          Object.prototype.toString.call(value).slice(8, -1)
+        }`,
+        vm
+      )
+      return
+    }
+    let selected, option
+    for (let i = 0, l = el.options.length; i < l; i++) {
+      option = el.options[i]
+      if (isMultiple) {
+        selected = looseIndexOf(value, getValue(option)) > -1
+        if (option.selected !== selected) {
+          option.selected = selected
+        }
+      } else {
+        if (looseEqual(getValue(option), value)) {
+          if (el.selectedIndex !== i) {
+            el.selectedIndex = i
+          }
+          return
         }
-        return
       }
     }
+    if (!isMultiple) {
+      el.selectedIndex = -1
+    }
   }
-  if (!isMultiple) {
-    el.selectedIndex = -1
+
+  cb()
+  /* istanbul ignore if */
+  if (isIE || isEdge) {
+    setTimeout(cb, 0)
   }
 }