Skip to content

Commit 5314f17

Browse files
committed
fix: v-if/v-else-if/v-else and v-model updating the wrong model
fixes #644, #569, #402, #405
1 parent a735ee5 commit 5314f17

File tree

5 files changed

+96
-12
lines changed

5 files changed

+96
-12
lines changed
Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,35 @@
11
import { genComponentModel, genAssignmentCode } from 'compiler/directives/model'
22
import { isKnownView, getViewMeta } from '../../element-registry'
3-
import { addHandler, addAttr } from 'compiler/helpers'
43

54
export default function model(el, dir) {
65
if (el.type === 1 && isKnownView(el.tag)) {
7-
genDefaultModel(el, dir.value, dir.modifiers)
6+
genViewComponentModel(el, dir.value, dir.modifiers)
87
} else {
98
genComponentModel(el, dir.value, dir.modifiers)
109
}
1110
}
1211

13-
function genDefaultModel(el, value, modifiers) {
14-
const { trim, number } = modifiers || {}
15-
const { prop, event } = getViewMeta(el.tag).model
16-
17-
let valueExpression = `$event.value${trim ? '.trim()' : ''}`
12+
function genViewComponentModel(el, value, modifiers) {
13+
debugger
14+
const { number, trim } = modifiers || {}
15+
const { prop } = getViewMeta(el.tag).model
1816

17+
const baseValueExpression = '$event'
18+
let valueExpression = `${baseValueExpression}.object[${JSON.stringify(prop)}]`
19+
if (trim) {
20+
valueExpression =
21+
`(typeof ${valueExpression} === 'string'` +
22+
`? ${valueExpression}.trim()` +
23+
`: ${valueExpression})`
24+
}
1925
if (number) {
2026
valueExpression = `_n(${valueExpression})`
2127
}
28+
const assignment = genAssignmentCode(value, valueExpression)
2229

23-
const code = genAssignmentCode(value, valueExpression)
24-
25-
addAttr(el, prop, `(${value})`)
26-
addHandler(el, event, code, null, true)
30+
el.model = {
31+
value: `(${value})`,
32+
expression: JSON.stringify(value),
33+
callback: `function (${baseValueExpression}) {debugger;${assignment}}`
34+
}
2735
}

platform/nativescript/runtime/modules/events.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ function updateDOMListeners(oldVnode, vnode) {
3131
const oldOn = oldVnode.data.on || {}
3232
target = vnode.elm
3333
updateListeners(on, oldOn, add, remove, vnode.context)
34+
target = undefined
3435
}
3536

3637
export default {

platform/nativescript/runtime/modules/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ import events from './events'
44
import style from './style'
55
import transition from './transition'
66

7-
export default [attrs, class_, events, style, transition]
7+
export default [class_, events, attrs, style, transition]

samples/app/569.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
const Vue = require('nativescript-vue')
2+
3+
Vue.config.debug = true
4+
Vue.config.silent = false
5+
6+
// console.log(Vue.compile('<Switch v-model="arrival" color="red"/>').render.toString())
7+
8+
new Vue({
9+
data() {
10+
return {
11+
items: [
12+
{ switch: false, value: 'Item 1' },
13+
{ switch: false, value: 'Item 2' },
14+
{ switch: false, value: 'Item 3' },
15+
{ switch: false, value: 'Item 4' },
16+
{ switch: false, value: 'Item 5' },
17+
{ switch: false, value: 'Item 6' },
18+
{ switch: false, value: 'Item 7' },
19+
{ switch: false, value: 'Item 8' },
20+
{ switch: false, value: 'Item 9' },
21+
{ switch: false, value: 'Item 10' },
22+
{ switch: false, value: 'Item 11' },
23+
{ switch: false, value: 'Item 12' },
24+
{ switch: false, value: 'Item 13' },
25+
{ switch: false, value: 'Item 14' },
26+
{ switch: false, value: 'Item 15' },
27+
{ switch: false, value: 'Item 16' },
28+
{ switch: false, value: 'Item 17' },
29+
{ switch: false, value: 'Item 18' },
30+
{ switch: false, value: 'Item 19' },
31+
{ switch: false, value: 'Item 20' }
32+
]
33+
}
34+
},
35+
template: `
36+
<ListView for="item in items">
37+
<v-template>
38+
<GridLayout padding="24" columns="*, auto, auto">
39+
<TextField v-model="item.value"/>
40+
<Label :text="item.switch" col="1"/>
41+
<Switch v-model="item.switch" col="2"/>
42+
</GridLayout>
43+
</v-template>
44+
</ListView>
45+
`
46+
}).$start()

samples/app/644.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
const Vue = require('nativescript-vue')
2+
3+
Vue.config.debug = true
4+
Vue.config.silent = false
5+
6+
// console.log(Vue.compile('<Switch v-model="arrival" color="red"/>').render.toString())
7+
8+
new Vue({
9+
data() {
10+
return {
11+
currentStep: 0,
12+
departure: false,
13+
arrival: false
14+
}
15+
},
16+
template: `
17+
<StackLayout>
18+
<Button :text="\`Step 0 - \${departure}\`" :color="currentStep === 0 ? 'green' : 'black'" @tap="currentStep = 0"/>
19+
<Button :text="\`Step 1 - \${arrival}\`" :color="currentStep === 1 ? 'green' : 'black'" @tap="currentStep = 1"/>
20+
<Button text="Toggle" @tap="departure = !departure"/>
21+
<GridLayout v-if="currentStep===0">
22+
<Switch v-model="departure" color="blue"/>
23+
</GridLayout>
24+
<GridLayout v-else-if="currentStep===1">
25+
<Switch v-model="arrival" color="red"/>
26+
</GridLayout>
27+
</StackLayout>
28+
`
29+
}).$start()

0 commit comments

Comments
 (0)