From e64b908a32011cf144e60734bcf4ca36d66ef521 Mon Sep 17 00:00:00 2001 From: neverland Date: Sat, 9 Feb 2019 10:26:05 +0800 Subject: [PATCH] [bugfix] Dialog: beforeClose not work for click overlay (#2707) --- packages/dialog/Dialog.js | 12 ++++++++++-- packages/dialog/test/index.spec.js | 16 +++++++++++++--- packages/mixins/popup/manager.js | 9 ++++++++- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/packages/dialog/Dialog.js b/packages/dialog/Dialog.js index d9b046117..385109abd 100644 --- a/packages/dialog/Dialog.js +++ b/packages/dialog/Dialog.js @@ -41,8 +41,13 @@ export default sfc({ }, methods: { + onClickOverlay() { + this.handleAction('overlay'); + }, + handleAction(action) { this.$emit(action); + if (this.beforeClose) { this.loading[action] = true; this.beforeClose(action, state => { @@ -57,8 +62,11 @@ export default sfc({ }, onClose(action) { - this.$emit('input', false); - this.callback && this.callback(action); + this.close(); + + if (this.callback) { + this.callback(action); + } } }, diff --git a/packages/dialog/test/index.spec.js b/packages/dialog/test/index.spec.js index 7b8ea669c..271be399a 100644 --- a/packages/dialog/test/index.spec.js +++ b/packages/dialog/test/index.spec.js @@ -1,7 +1,7 @@ import Vue from 'vue'; import Dialog from '..'; import DialogVue from '../Dialog'; -import { mount, later, transitionStub } from '../../../test/utils'; +import { mount, later, trigger, transitionStub } from '../../../test/utils'; transitionStub(); @@ -39,6 +39,7 @@ test('before close', () => { propsData: { value: true, showCancelButton: true, + closeOnClickOverlay: true, beforeClose: (action, done) => done(false) } }); @@ -49,10 +50,19 @@ test('before close', () => { expect(wrapper.emitted('input')).toBeFalsy(); wrapper.setProps({ - beforeClose: (action, done) => done() + beforeClose: (action, done) => { + if (action === 'cancel') { + done(); + } + } }); + + const overlay = document.querySelector('.van-overlay'); + trigger(overlay, 'click'); + expect(wrapper.emitted('input')).toBeFalsy(); + cancel.trigger('click'); - expect(wrapper.emitted('input')).toBeTruthy(); + expect(wrapper.emitted('input')[0]).toBeTruthy(); }); test('set default options', () => { diff --git a/packages/mixins/popup/manager.js b/packages/mixins/popup/manager.js index c35fb78c7..befa10ff7 100644 --- a/packages/mixins/popup/manager.js +++ b/packages/mixins/popup/manager.js @@ -63,7 +63,14 @@ export default { if (context.top) { const { vm } = context.top; vm.$emit('click-overlay'); - vm.closeOnClickOverlay && vm.$emit('input', false); + + if (vm.closeOnClickOverlay) { + if (vm.onClickOverlay) { + vm.onClickOverlay(); + } else { + vm.close(); + } + } } } };