diff --git a/src/platforms/web/compiler/modules/model.js b/src/platforms/web/compiler/modules/model.js
index 4b14490cef..61657d1fa4 100644
--- a/src/platforms/web/compiler/modules/model.js
+++ b/src/platforms/web/compiler/modules/model.js
@@ -36,7 +36,7 @@ function preTransformNode (el: ASTElement, options: CompilerOptions) {
addRawAttr(branch0, 'type', 'checkbox')
processElement(branch0, options)
branch0.processed = true // prevent it from double-processed
- branch0.if = `type==='checkbox'` + ifConditionExtra
+ branch0.if = `(${typeBinding})==='checkbox'` + ifConditionExtra
addIfCondition(branch0, {
exp: branch0.if,
block: branch0
@@ -47,7 +47,7 @@ function preTransformNode (el: ASTElement, options: CompilerOptions) {
addRawAttr(branch1, 'type', 'radio')
processElement(branch1, options)
addIfCondition(branch0, {
- exp: `type==='radio'` + ifConditionExtra,
+ exp: `(${typeBinding})==='radio'` + ifConditionExtra,
block: branch1
})
// 3. other
diff --git a/test/unit/features/directives/model-dynamic.spec.js b/test/unit/features/directives/model-dynamic.spec.js
index 16d990a5d0..eb193f19bd 100644
--- a/test/unit/features/directives/model-dynamic.spec.js
+++ b/test/unit/features/directives/model-dynamic.spec.js
@@ -4,15 +4,15 @@ describe('Directive v-model dynamic input type', () => {
it('should work', done => {
const vm = new Vue({
data: {
- type: null,
+ inputType: null,
test: 'b'
},
- template: ``
+ template: ``
}).$mount()
document.body.appendChild(vm.$el)
// test text
- assertInputWorks(vm).then(done)
+ assertInputWorks(vm, 'inputType').then(done)
})
it('with v-if', done => {
@@ -87,7 +87,11 @@ describe('Directive v-model dynamic input type', () => {
})
})
-function assertInputWorks (vm, chain) {
+function assertInputWorks (vm, type, chain) {
+ if (typeof type !== 'string') {
+ if (!chain) chain = type
+ type = 'type'
+ }
if (!chain) chain = waitForUpdate()
chain.then(() => {
expect(vm.$el.value).toBe('b')
@@ -99,7 +103,7 @@ function assertInputWorks (vm, chain) {
expect(vm.test).toBe('c')
}).then(() => {
// change it to password
- vm.type = 'password'
+ vm[type] = 'password'
vm.test = 'b'
}).then(() => {
expect(vm.$el.type).toBe('password')
@@ -109,7 +113,7 @@ function assertInputWorks (vm, chain) {
expect(vm.test).toBe('c')
}).then(() => {
// change it to checkbox...
- vm.type = 'checkbox'
+ vm[type] = 'checkbox'
}).then(() => {
expect(vm.$el.type).toBe('checkbox')
expect(vm.$el.checked).toBe(true)