From 0130c3cfd3acc11fa87926acf6667e2e12516de9 Mon Sep 17 00:00:00 2001 From: defcc Date: Thu, 19 Jan 2017 22:21:50 +0800 Subject: [PATCH 1/3] support select multiple binding --- .../web/compiler/directives/model.js | 6 ++--- .../features/directives/model-select.spec.js | 25 +++++++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/platforms/web/compiler/directives/model.js b/src/platforms/web/compiler/directives/model.js index c5bcb52aa2d..b598e6c5f76 100644 --- a/src/platforms/web/compiler/directives/model.js +++ b/src/platforms/web/compiler/directives/model.js @@ -163,12 +163,12 @@ function genSelect ( } const number = modifiers && modifiers.number - const assignment = `Array.prototype.filter` + + const selectedVal = `Array.prototype.filter` + `.call($event.target.options,function(o){return o.selected})` + `.map(function(o){var val = "_value" in o ? o._value : o.value;` + - `return ${number ? '_n(val)' : 'val'}})` + - (el.attrsMap.multiple == null ? '[0]' : '') + `return ${number ? '_n(val)' : 'val'}})` + const assignment = `$event.target.multiple ? ${selectedVal}: ${selectedVal}[0]` const code = genAssignmentCode(value, assignment) addHandler(el, 'change', code, null, true) } diff --git a/test/unit/features/directives/model-select.spec.js b/test/unit/features/directives/model-select.spec.js index a82fd37aa62..46ce67305dd 100644 --- a/test/unit/features/directives/model-select.spec.js +++ b/test/unit/features/directives/model-select.spec.js @@ -261,6 +261,31 @@ describe('Directive v-model select', () => { }) } + it('should work with multiple binding', (done) => { + const spy = jasmine.createSpy() + const vm = new Vue({ + data: { + isMultiple: true, + selections: ['1'] + }, + template: + '', + watch: { + selections: spy + } + }).$mount() + document.body.appendChild(vm.$el) + vm.$el.options[1].selected = true + triggerEvent(vm.$el, 'change') + waitForUpdate(() => { + expect(spy).toHaveBeenCalled() + expect(vm.selections).toEqual(['1', '2']) + }).then(done) + }) + it('multiple with static template', () => { const vm = new Vue({ template: From d5ee209d8afc53df2e61d44d97751b9f13728ef3 Mon Sep 17 00:00:00 2001 From: defcc Date: Fri, 20 Jan 2017 01:01:24 +0800 Subject: [PATCH 2/3] improve select onchange handle --- src/platforms/web/compiler/directives/model.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/platforms/web/compiler/directives/model.js b/src/platforms/web/compiler/directives/model.js index b598e6c5f76..ff0729728a8 100644 --- a/src/platforms/web/compiler/directives/model.js +++ b/src/platforms/web/compiler/directives/model.js @@ -168,8 +168,9 @@ function genSelect ( `.map(function(o){var val = "_value" in o ? o._value : o.value;` + `return ${number ? '_n(val)' : 'val'}})` - const assignment = `$event.target.multiple ? ${selectedVal}: ${selectedVal}[0]` - const code = genAssignmentCode(value, assignment) + const assignment = '$event.target.multiple ? $$selectedVal:$$selectedVal[0]' + let code = `var $$selectedVal = ${selectedVal};` + code = `${code} ${genAssignmentCode(value, assignment)}` addHandler(el, 'change', code, null, true) } From fe662fd4958024a9635b0f1c306c39a97981624a Mon Sep 17 00:00:00 2001 From: defcc Date: Fri, 20 Jan 2017 01:08:20 +0800 Subject: [PATCH 3/3] update style --- src/platforms/web/compiler/directives/model.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platforms/web/compiler/directives/model.js b/src/platforms/web/compiler/directives/model.js index ff0729728a8..416091b125f 100644 --- a/src/platforms/web/compiler/directives/model.js +++ b/src/platforms/web/compiler/directives/model.js @@ -168,7 +168,7 @@ function genSelect ( `.map(function(o){var val = "_value" in o ? o._value : o.value;` + `return ${number ? '_n(val)' : 'val'}})` - const assignment = '$event.target.multiple ? $$selectedVal:$$selectedVal[0]' + const assignment = '$event.target.multiple ? $$selectedVal : $$selectedVal[0]' let code = `var $$selectedVal = ${selectedVal};` code = `${code} ${genAssignmentCode(value, assignment)}` addHandler(el, 'change', code, null, true)