Skip to content

Commit 06d3aa7

Browse files
committed
fix(v-model): ensure v-model listeners are attached before v-on
fix #65
1 parent 15f75e9 commit 06d3aa7

File tree

2 files changed

+8
-6
lines changed

2 files changed

+8
-6
lines changed

src/walk.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,20 +61,22 @@ export const walk = (node: Node, ctx: Context): ChildNode | null | void => {
6161
walkChildren(el, ctx)
6262

6363
// other directives
64-
let deferredModel
64+
const deferred: [string, string][] = []
6565
for (const { name, value } of [...el.attributes]) {
6666
if (dirRE.test(name) && name !== 'v-cloak') {
6767
if (name === 'v-model') {
6868
// defer v-model since it relies on :value bindings to be processed
69-
// first
70-
deferredModel = value
69+
// first, but also before v-on listeners (#73)
70+
deferred.unshift([name, value])
71+
} else if (name[0] === '@' || /^v-on\b/.test(name)) {
72+
deferred.push([name, value])
7173
} else {
7274
processDirective(el, name, value, ctx)
7375
}
7476
}
7577
}
76-
if (deferredModel) {
77-
processDirective(el, 'v-model', deferredModel, ctx)
78+
for (const [name, value] of deferred) {
79+
processDirective(el, name, value, ctx)
7880
}
7981

8082
if (hasVOnce) {

tests/model.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ <h2>Radio</h2>
5656
<div>{{ radioSelected }}</div>
5757

5858
<h2>Select</h2>
59-
<select v-model="selected">
59+
<select v-model="selected" @change="console.log(selected, $event.target.value)">
6060
<option>one</option>
6161
<option>two</option>
6262
<option>three</option>

0 commit comments

Comments
 (0)