From 7896f3b0c5b34194dae108de3191103b141bcead Mon Sep 17 00:00:00 2001 From: defcc Date: Wed, 12 Oct 2016 00:12:17 +0800 Subject: [PATCH 1/2] fix multiple select render. The mutliple attribute of select dosen't apply at first, so the mutli selected option dosen't work when patching --- src/core/vdom/patch.js | 2 +- src/platforms/web/runtime/node-ops.js | 12 ++++++++++-- .../unit/features/directives/model-select.spec.js | 15 +++++++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/core/vdom/patch.js b/src/core/vdom/patch.js index f7baa787faa..b5d89e02436 100644 --- a/src/core/vdom/patch.js +++ b/src/core/vdom/patch.js @@ -115,7 +115,7 @@ export function createPatchFunction (backend) { } vnode.elm = vnode.ns ? nodeOps.createElementNS(vnode.ns, tag) - : nodeOps.createElement(tag) + : nodeOps.createElement(tag, vnode) setScope(vnode) createChildren(vnode, children, insertedVnodeQueue) if (isDef(data)) { diff --git a/src/platforms/web/runtime/node-ops.js b/src/platforms/web/runtime/node-ops.js index 5b96e98f945..3a295e2f4e8 100644 --- a/src/platforms/web/runtime/node-ops.js +++ b/src/platforms/web/runtime/node-ops.js @@ -2,8 +2,16 @@ import { namespaceMap } from 'web/util/index' -export function createElement (tagName: string): Element { - return document.createElement(tagName) +export function createElement (tagName: string, vnode: VNode): Element { + const elm = document.createElement(tagName) + if (tagName !== 'select') { + return elm + } + if (vnode.data && vnode.data.attrs && 'multiple' in vnode.data.attrs) { + elm.setAttribute('multiple', 'multiple') + delete vnode.data.attrs.multiple + } + return elm } export function createElementNS (namespace: string, tagName: string): Element { diff --git a/test/unit/features/directives/model-select.spec.js b/test/unit/features/directives/model-select.spec.js index e582523b9dc..9b6092f26e1 100644 --- a/test/unit/features/directives/model-select.spec.js +++ b/test/unit/features/directives/model-select.spec.js @@ -189,6 +189,21 @@ describe('Directive v-model select', () => { }).then(done) }) + it('multiple with static template', () => { + const vm = new Vue({ + template: + '' + }).$mount() + var opts = vm.$el.options + expect(opts[0].selected).toBe(true) + expect(opts[1].selected).toBe(true) + expect(opts[2].selected).toBe(true) + }) + it('multiple + v-for', done => { const vm = new Vue({ data: { From 64f2be7d42ec4ac388c4853888ca30cbaa3ed1e2 Mon Sep 17 00:00:00 2001 From: defcc Date: Wed, 12 Oct 2016 00:27:26 +0800 Subject: [PATCH 2/2] keep the vnode.data the same as before --- src/platforms/web/runtime/node-ops.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/platforms/web/runtime/node-ops.js b/src/platforms/web/runtime/node-ops.js index 3a295e2f4e8..0891a24f8cd 100644 --- a/src/platforms/web/runtime/node-ops.js +++ b/src/platforms/web/runtime/node-ops.js @@ -9,7 +9,6 @@ export function createElement (tagName: string, vnode: VNode): Element { } if (vnode.data && vnode.data.attrs && 'multiple' in vnode.data.attrs) { elm.setAttribute('multiple', 'multiple') - delete vnode.data.attrs.multiple } return elm }