Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/platforms/web/compiler/modules/model.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ function preTransformNode (el: ASTElement, options: CompilerOptions) {
if (map[':type'] || map['v-bind:type']) {
typeBinding = getBindingAttr(el, 'type')
}
if (!typeBinding && map['v-bind']) {
if (!map.type && !typeBinding && map['v-bind']) {
Copy link
Member

@jkzing jkzing Mar 13, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This would make following case lose type binding:

<input type="checkbox" v-model="test" v-bind="{type: typeBindingValue}">

So maybe

typeBinding = `(${map['v-bind']}).type || '${map.type}'`

EDIT: the one above is not comprehensive, while map.type still could be undefined.

typeBinding = `(${map['v-bind']}).type || ${JSON.stringify(map.type)}`

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@hirokiosame If you could add the test as well, that would be great 👌

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we should allow v-bind to override a static type, it's gonna be confusing if done accidentally and I don't think there's a valid use case.

typeBinding = `(${map['v-bind']}).type`
}

Expand Down
10 changes: 10 additions & 0 deletions test/unit/features/directives/model-checkbox.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -337,4 +337,14 @@ describe('Directive v-model checkbox', () => {
expect(vm.$el.children[1].textContent).toBe('false')
}).then(done)
})

it('should have type="checkbox"', () => {
const vm = new Vue({
data: {
test: true
},
template: '<input type="checkbox" v-model="test" v-bind="$attrs">'
}).$mount()
expect(vm.$el.type).toBe('checkbox')
})
})