如何防止 Vue 中的对话框完成之前选择表单被更改

2024-01-07

我有一个包含各种选项的选择字段。当用户单击该字段来更改当前选择时,我需要启动一个提示,让用户确认他们希望继续更改,因为这将需要他们重做一个漫长的过程。如果他们取消更改,则需要防止所选选项发生更改,因为即使是快速的临时更改也会触发客户端上的自动保存。正因为如此,似乎其他解决方案 https://stackoverflow.com/questions/14019670/how-to-prevent-a-select-from-being-changed不起作用,因为它们保存原始值,让更改通过,然后在必要时恢复更改。

我不确定这是否是“正确的”方法,但我决定创建一个在每次单击选择字段时运行的函数。我通过使用本机成功解决了这个问题confirm下面代码中的方法。我相信它有效,因为confirm的同步性质允许我在任何事件侦听器收到更改之前恢复更改,因此基本上就像更改从未发生过(如果我错了,请纠正我)。不幸的是,我不被允许使用confirm由于兼容性原因。

// This works, but I need to be able to do it without using 'confirm'
handlePotentialOptionChange(e){
  if (this.currentOption !== e.target.value){
    if (!confirm(`Are you sure you want to change the option from ${this.currentOption} to ${e.target.value}? You will be required to redo multiple fields.`)){
      this.selectModel = this.currentOption // If user cancels the change, revert it to the original option. 
    }
  }
}

由于我无法使用confirm,我正在使用来自 Buefy 的对话框组件 https://buefy.org/documentation/dialog/。但是,它是异步运行的,这意味着当用户尝试选择不同的选项时,选项更改将在他们回答对话框之前完成。如果取消,下面的代码将恢复更改,但到那时已经太晚了,没有任何用处。

handlePotentialOptionChange(e){
  if (this.currentOption !== e.target.value){
    this.$dialog.confirm({
      message: `Are you sure you want to change the option from ${this.currentOption} to ${e.target.value}? You will be required to redo multiple fields.`,
      onConfirm: () => this.selectModel = e.target.value,
      onCancel: () => this.selectModel = this.currentOption
    })
  }
}

是否可以让用户看到选项下拉列表,但禁用任何类型的选项更改,直到回答提示为止,以便我可以在异步内部相应地更改选项onConfirm and onCancel功能?或者我应该使用某种完全不同的方法?谢谢。


我将创建一个新组件,它结合了选择元素和确认对话框,并让它发出“输入”事件(仅当新选择已确认时)并接收“值”道具,以便父级可以将其与 v- 一起使用模型。

运行代码片段并阅读下面的示例。

Vue.component('select-confirm', {
  props: ['value'],

  data: function () {
    return {
      showConfirmationDialog: false,
      unconfirmedValue: 'a'
    }
  },

  methods: {
    cancelSelection () {
      this.showConfirmationDialog = false
    },
    
    confirmSelection () {
      this.$emit('input', this.unconfirmedValue)
      this.showConfirmationDialog = false
    },
    
    showConfirmation (e) {
      this.unconfirmedValue = e.currentTarget.value
      this.showConfirmationDialog = true
    }
  },

  template: `
    <div class="select-confirm">
      <select :value="value" @change="showConfirmation">
        <option value="a">A</option>
        <option value="b">B</option>
      </select>
      <div v-if="showConfirmationDialog" class="confirmation-dialog">
        <p>Are you sure you want to change your selection to '{{ this.unconfirmedValue }}'?</p>
        <button @click="confirmSelection">Yes</button>
        <button @click="cancelSelection">No</button>
      </div>
    </div>
  `
})

new Vue({
  el: '#app',
  data () {
    return {
      confirmedValue: 'a'
    }
  }
})
<script src="https://unpkg.com/[email protected] /cdn-cgi/l/email-protection/dist/vue.min.js"></script>
<div id="app">
  <select-confirm v-model="confirmedValue"></select-confirm>
  <p>Confirmed value is '{{ confirmedValue }}'.</p>
</div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何防止 Vue 中的对话框完成之前选择表单被更改 的相关文章

随机推荐

  • django 中带有持续时间字段的聚合

    我的模型是 class Mo Model dur DurationField default timedelta 0 price per minute FloatField default 0 0 minutes int IntegerFi
  • 我可以使用 OAuth 令牌作为 Ocp-Apim-Subscription-Key 的替代品吗?

    我正在考虑使用 Azure API 管理为许多后端 API 提供一致的前端 大多数 API 使用 OAuth 2 0 应用程序流程 ClientID 客户端密钥 后端 API 检查声明 范围 进行保护 这很好用 但是当客户通过 APIM 使
  • ORM vs 传统数据库查询,它们的字段是什么?

    ORM 似乎是一个快速发展的模型 有利也有弊 来自 Richard Kiessig 的超快速 ASP NET http www amazon com Ultra Fast ASP NET Build Ultra Scalable Serve
  • QSocketNotifier:无法从另一个线程启用或禁用套接字通知程序

    我尝试使用 QT 构建一个多线程游戏服务器 因此 每个客户端都是一个基于 QThread 的独立线程 现在我需要将数据发送到同一游戏室中的其他客户端 在其他线程中 例如 当房主关闭游戏房间时 游戏服务器需要向同一 soom 中的其他客户端发
  • 如何检查 Linux 上进程的堆大小

    我正在编写一些代码 但它一直崩溃 后来在挖掘转储后 我意识到我超出了最大堆限制 如果我添加了对 malloc 的检查 生活会更容易 尽管我修复了这个问题 有什么方法可以增加我的堆大小吗 PS 相当类似的问题 https stackoverf
  • 未根据标记名对博客详细信息进行分组

    我正在尝试分组blogdetails基于tagname 单击第二个加号按钮时 想要将每个标记名下的所有博客详细信息分组 目前 它忽略分组并仅显示标记名 有人可以告诉我这里可能有什么问题吗 我添加了代码沙箱链接以供参考 https codes
  • 在 Mongo 中存储嵌套类别(或分层数据)的最有效方法?

    我们为多种产品提供了嵌套类别 例如 体育 gt 篮球 gt 男子 体育 gt 网球 gt 女子 并使用 Mongo 而不是 MySQL 我们知道如何在 MySQL 等 SQL 数据库中存储嵌套类别 但如果您能提供有关如何对 Mongo 执行
  • 如何向 html 表格添加 jQuery 过滤器?

    我正在尝试使用 JQuery 将下拉过滤器放入 html 表中 这是代码 报告 php table class table table striped thead tr th th th First Name th th Last Name
  • 从 JavaScript 函数对象的名称获取字符串形式?

    在 JavaScript 中 如果变量中有一个字符串 有没有办法获取对具有匹配名称的函数对象的引用 请注意 我可以使用 jQuery 因此我也可以使用它的任何辅助方法 例如 myFunction function var func name
  • 是否可以只需要测试而不需要安装包?

    我正在向现有的可安装 pip 的项目添加功能 项目所有者认为我的添加pandas对 setup py 的安装要求 太重 因为该项目应该保持苗条 我添加的功能不需要pandas 因为该功能是在pandas DataFrame对象 但我为它编写
  • 如何在 ActionBarSherlock 中实现多选和上下文 ActionMode?

    我应该如何使用 ActionBarSherlock 在 AdapterView 上实现多选 因为它不提供 MultiChoiceModeListener 这就是它的样子 你怎么能这样做呢 这就是我所做的 编辑 自从我发现之前的答案有很多无用
  • Node.js Firestore 查询选择字段路径列表

    我尝试创建并返回一个新的 Query 实例 该实例将字段掩码应用于结果并仅返回指定的字段子集 当我使用时 let query firestore collection col select field1 field2 field3 get
  • ANDROID_HOME 未设置(VSTS 代理在 OS X 上作为服务运行)

    我已经在 MacBook Pro 上配置了 VSTS 代理 当我手动运行它时 使用 run sh 但是 当我将 VSTS 代理配置为作为服务运行时 使用 svc sh install and svc sh start 并在 VSTS 中对新
  • Fabric.js + 谷歌字体

    可以用吗Fabric js https github com kangax fabric js wiki How to render text使用网络字体 而不附加 Cufon 库及其字体 我可以使用标准画布功能轻松做到这一点 所以我想知道
  • 如何将 Nullable DateTime 变量的 null 值转换为 DbNull.Value

    我有一个可为空的日期时间变量 我想将它写入 SQL DB 当我尝试插入时 如果变量有值就没有问题 但如果它没有值 插入就会因错误而中断 我想问 如何通过DbCommand参数向Sql插入可为空的DateTime P S Sql 列也可以为空
  • onStartJob 和 onStopJob 无法在 android 中运行后台线程

    实际上我想使用 JobScheduler 进行通知 无论应用程序是否处于活动状态 我是 android 新手 首先只是尝试运行后台 AsyncTask 来检查它是否工作正常 但它不起作用 这是我的 JobService 代码 public
  • PyCharm - 作者是否出现在导入之前?

    当您创建新的 python 文件并添加新的导入时 PyCharm 会尽可能自动添加导入和 author 标签 但是 默认情况下 author 标签将始终出现在任何导入的下方 在我看来 author 标签应该位于文件的顶部 我也可以在其中放置
  • 在 RoR 中哪里可以重新开放课程

    我正在尝试重新打开StringRails 中的类并添加更多方法供我的应用程序使用 编写代码不是问题 我的问题是该代码应该放在哪里 对我来说 在不同的模型文件中重新打开一个类是没有意义的 因为它实际上与任何模型都没有任何关系 我想也许在某个地
  • LINQ - 组合多个列表以形成一个新列表并按键对齐它们?

    我有两个不同列的列表 但每个列表都有一个具有相同键的公共列 如何将它们组合成一个新列表 即 public class TradeBalanceBreak public int CommID get set public int CPFirm
  • 如何防止 Vue 中的对话框完成之前选择表单被更改

    我有一个包含各种选项的选择字段 当用户单击该字段来更改当前选择时 我需要启动一个提示 让用户确认他们希望继续更改 因为这将需要他们重做一个漫长的过程 如果他们取消更改 则需要防止所选选项发生更改 因为即使是快速的临时更改也会触发客户端上的自