Skip to content

Commit 6cf1929

Browse files
committed
adjust v-model on component sync mechanism (fix #3179)
1 parent 1b60a88 commit 6cf1929

File tree

3 files changed

+8
-15
lines changed

3 files changed

+8
-15
lines changed

examples/select2/index.html

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
.select2({ data: this.options })
4949
// emit event on change.
5050
.on('change', function () {
51-
vm.$emit('input', mockEvent(this.value))
51+
vm.$emit('input', this.value)
5252
})
5353
},
5454
watch: {
@@ -66,16 +66,6 @@
6666
}
6767
})
6868

69-
// mock an event because the v-model binding expects
70-
// event.target.value
71-
function mockEvent (value) {
72-
return {
73-
target: {
74-
value: value
75-
}
76-
}
77-
}
78-
7969
var vm = new Vue({
8070
el: '#el',
8171
template: '#demo-template',

src/platforms/web/compiler/directives/model.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,15 +98,18 @@ function genDefaultModel (
9898
const { lazy, number, trim } = modifiers || {}
9999
const event = lazy ? 'change' : 'input'
100100
const needCompositionGuard = !lazy && type !== 'range'
101+
const isNative = el.tag === 'input' || el.tag === 'textarea'
101102

102-
const valueExpression = `$event.target.value${trim ? '.trim()' : ''}`
103+
const valueExpression = isNative
104+
? `$event.target.value${trim ? '.trim()' : ''}`
105+
: `$event`
103106
let code = number || type === 'number'
104107
? `${value}=_n(${valueExpression})`
105108
: `${value}=${valueExpression}`
106-
if (needCompositionGuard) {
109+
if (isNative && needCompositionGuard) {
107110
code = `if($event.target.composing)return;${code}`
108111
}
109-
addProp(el, 'value', `_s(${value})`)
112+
addProp(el, 'value', isNative ? `_s(${value})` : `(${value})`)
110113
addHandler(el, event, code)
111114
if (needCompositionGuard) {
112115
// need runtime directive code to help with composition events

test/unit/features/directives/model-component.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ describe('Directive v-model component', () => {
2121
methods: {
2222
onInput (e) {
2323
// something validate ...
24-
this.$emit('input', e)
24+
this.$emit('input', e.target.value)
2525
}
2626
},
2727
mounted () {

0 commit comments

Comments
 (0)