diff --git a/flow/compiler.js b/flow/compiler.js index a5ebc5f3862..c7a2099d7cc 100644 --- a/flow/compiler.js +++ b/flow/compiler.js @@ -131,6 +131,7 @@ declare type ASTElement = { value: string; callback: string; expression: string; + event: string; }; directives?: Array; diff --git a/flow/vnode.js b/flow/vnode.js index 46fe3deac67..e2eba42c466 100644 --- a/flow/vnode.js +++ b/flow/vnode.js @@ -62,6 +62,7 @@ declare interface VNodeData { model?: { value: any; callback: Function; + event: string; }; }; diff --git a/src/compiler/codegen/index.js b/src/compiler/codegen/index.js index 17b31e5b510..0366919f1c5 100644 --- a/src/compiler/codegen/index.js +++ b/src/compiler/codegen/index.js @@ -255,6 +255,8 @@ export function genData (el: ASTElement, state: CodegenState): string { el.model.callback },expression:${ el.model.expression + },event:${ + el.model.event }},` } // inline-template diff --git a/src/compiler/directives/model.js b/src/compiler/directives/model.js index 8c1f55bf663..495d6b2e993 100644 --- a/src/compiler/directives/model.js +++ b/src/compiler/directives/model.js @@ -8,7 +8,7 @@ export function genComponentModel ( value: string, modifiers: ?ASTModifiers ): ?boolean { - const { number, trim } = modifiers || {} + const { number, trim, lazy } = modifiers || {} const baseValueExpression = '$$v' let valueExpression = baseValueExpression @@ -26,6 +26,7 @@ export function genComponentModel ( el.model = { value: `(${value})`, expression: `"${value}"`, + event: lazy ? `'change'` : `'input'`, callback: `function (${baseValueExpression}) {${assignment}}` } } diff --git a/src/core/vdom/create-component.js b/src/core/vdom/create-component.js index d3de4fb4c20..a8b0c1d25db 100644 --- a/src/core/vdom/create-component.js +++ b/src/core/vdom/create-component.js @@ -244,7 +244,7 @@ function mergeHook (one: Function, two: Function): Function { // prop and event handler respectively. function transformModel (options, data: any) { const prop = (options.model && options.model.prop) || 'value' - const event = (options.model && options.model.event) || 'input' + const event = (options.model && options.model.event) || data.model.event ;(data.props || (data.props = {}))[prop] = data.model.value const on = data.on || (data.on = {}) if (isDef(on[event])) { diff --git a/test/unit/features/directives/model-component.spec.js b/test/unit/features/directives/model-component.spec.js index 6098e4d6241..53e9a9c3439 100644 --- a/test/unit/features/directives/model-component.spec.js +++ b/test/unit/features/directives/model-component.spec.js @@ -148,4 +148,21 @@ describe('Directive v-model component', () => { vm.$refs.input.$emit('input', ' foo o ') expect(vm.text).toBe('foo o') }) + + it('modifier: .lazy', () => { + const vm = new Vue({ + template: `
`, + data: { text: 'foo' }, + components: { + 'my-input': { + template: '' + } + } + }).$mount() + expect(vm.text).toBe('foo') + vm.$refs.input.$emit('input', 'bar') + expect(vm.text).toBe('foo') + vm.$refs.input.$emit('change', 'baz') + expect(vm.text).toBe('baz') + }) }) diff --git a/test/weex/compiler/v-model.spec.js b/test/weex/compiler/v-model.spec.js index c5f0401dc7b..d6f26a49aed 100644 --- a/test/weex/compiler/v-model.spec.js +++ b/test/weex/compiler/v-model.spec.js @@ -14,7 +14,7 @@ describe('compile v-model', () => { it('should compile other component with whole $event as the value', () => { const { render, staticRenderFns, errors } = compile(`
`) expect(render).not.toBeUndefined() - expect(render).toMatch(strToRegExp(`model:{value:(x),callback:function ($$v) {x=$$v},expression:"x"}`)) + expect(render).toMatch(strToRegExp(`model:{value:(x),callback:function ($$v) {x=$$v},expression:"x",event:'input'}`)) expect(staticRenderFns).toEqual([]) expect(errors).toEqual([]) })