【发布时间】:2019-06-29 05:11:14
【问题描述】:
算法:
- 我发现两个对象数组之间的区别(什么是新的、什么是删除的、重命名的等)。差异存储在
data[1-5] - 基于#1,我为模态准备了一个文本摘要(文本对象)
通知用户发现了什么不同。此摘要存储在
someDataToShowInModal。 - 发现差异时,必须向用户显示带有摘要的模式。用户应接受(单击确定)或拒绝(单击取消)以应用更改。
-
问题:如何等到用户点击模态框的 OK 或 CANCEL 按钮?
在代码中我展示了两种可能的解决方案,但不知道如何实现它们:
将模态包装到 Promise 中。
使用
state.doSave并以某种方式等待它被myModalComponent更改。
如果用户单击“确定”,则应用更改。
下面是伪代码,显示了我尝试实现的逻辑:
state.js
modalTextSummary = {}
action.js
async myAction ({ state }) {
let modalClosed
let someDataToShowInModal = {}
let data1 = []
let data2 = []
let data3 = []
let data4 = []
let data5 = []
// #1. Push difference to "data[1-5]"
data1.push(xyz1)
data2.push(xyz2)
data3.push(xyz3)
data4.push(xyz4)
data5.push(xyz5)
// #2. Based on data[1-5] prepare "someDataToShowInModal"
someDataToShowInModal = {xyz}
// #3. We change "state.modalTextSummary" and by this we open
// a Modal (because "myModalCompont" has "watch: {modalTextSummary}")
state.modalTextSummary = someDataToShowInModal
// #4. HOW TO WAIT UNTIL USER CLICKS Modal's "OK" or "CANCEL"?
// v1:
// something like...
modalClosed = await myModalComponent
// v2:
// I can add "state.doSave = ''" which can be
// set by "myModalComponent" to either 'OK' or 'CANCEL', but how
// in this case I can wait for state changes?
modalClosed = await state.doSave !== ''
// #5. Apply changes
if (modalCloses === 'OK') {
// ... code which handles data from data[1-5]
}
}
myModalComponent.js
<script>
import { mapState } from 'vuex'
export default {
computed: {
...mapState([
'modalTextSummary'
])
},
watch: {
modalTextSummary: function () {
if (this.modalTextSummary !== {}) {
// Here I show bootstrap-vue modal
}
}
}
}
</script>
我知道一旦通过 OK 按钮关闭模态框后如何调用函数,但在这种情况下,有必要在 vuex 中临时保存数据 [1-5] 以便在被调用函数中再次选择它们,我想要使用更简单的方法来避免它。
【问题讨论】:
-
由于 JavaScript 的异步特性,您将无法真正“等待”直到模式关闭;您将不得不实现回调或一些
Promise。如果您使用的是现代 JS,您可以尝试使用await,但在幕后,它将使用Promise。 -
是的,我知道。这就是您可以在我的代码中找到
async/await的原因。我会澄清的。谢谢。 -
我明白了...我现在无法编写示例代码,但要使用
Promise,您需要将 OK/CANCEL 按钮的单击事件捕获封装在内部Promise,点击事件本身需要调用resolve函数。 -
这与我正在谈论的内容相似,但不是从某个发射器捕获事件,而是从按钮捕获事件:stackoverflow.com/a/29933215/679240
标签: javascript vuejs2 bootstrap-4 vuex bootstrap-vue