【问题标题】:Is there anyway to prevent v-dialog from closing?有没有办法阻止 v-dialog 关闭?
【发布时间】:2020-05-04 18:17:31
【问题描述】:

我正在使用<v-dialog> 组件来显示我的网络应用程序的表单。我想实现一个未保存的更改对话框以在用户中止更改而不保存并根据按钮按下关闭/保持对话框打开时弹出。不幸的是,我在弄清楚如何防止框架执行默认关闭操作时遇到了很多麻烦。

据我所知,您可以通过 3 种不同的方式关闭对话框:

  1. v-model 属性设置为false
  2. v-dialog 模式之外单击,除非 persistent 属性设置为 true
  3. 按退出键。

我们不用担心关闭我上面提到的对话框并假设它设置为true 的第二种方式。

方法一:

我的第一种方法是只允许用户在点击表单上的取消按钮时退出对话框。当我试图禁用退出按钮时,我很快遇到了障碍。

这是我迄今为止尝试过的:在我的 App.vue mounted 函数中:

mounted () {
  document.addEventListener('keydown', (e) => {
    if (e.key === 'Escape') {
      console.log('The escape key was pressed.')
      e.preventDefault()
      e.returnValue = false
      e.stopImmediatePropagation()
    }
  })
} 

这应该可以了。 日志消息显示在控制台中,但在按下退出键后对话框仍然关闭。我知道我应该在这里使用关键代码,但这是为了便于阅读。我也试过keyupkeypress 没有成功。在 Vue.js 或 Vuetify 框架中肯定发生了一些不正常的事情,这把这件事搞砸了。

方法 #2:

在我尝试禁用转义键失败后,我不得不尝试不同的方法。我尝试在监视函数中添加此代码,以尝试在它们取消时保持对话框打开:

dialog (val) {
  if (val) {
    console.log('Dialog is true')
  } else if (!val && !confirm('Unsaved changes, do you still want to exit?')) {
    console.log('User Wants to Keep Dialog Open')
    this.dialog = true
  } else {
    console.log('Dialog is False')
    this.close()
  }
}

当我尝试关闭对话框时,会弹出确认消息,然后我点击了取消按钮。然后,出于某种原因,确认对话框再次打开。所以,我再次点击取消,然后对话框像什么都没发生一样消失。以下是控制台读取的内容:

用户希望保持对话框打开
对话是真的
用户希望保持对话框打开
对话框是真的

我明白为什么再次调用对话框监视方法,但我不明白为什么confirm 对话框再次显示。在第一次取消确认消息后,该代码不应该被执行。日志消息显示代码不可能再次执行。一定是在幕后发生了一些我没有意识到的事情。

有人有防止v-dialog 组件关闭的经验吗?或者对我的两种方法有什么帮助?提前致谢。

【问题讨论】:

  • 您可以为您的问题创建一个代码框吗?这样会更容易查看。
  • @Ohgodwhy 的回答解决了这个问题,尽管 Vuetify 的文档没有提到它也会阻止退出按钮退出。

标签: vue.js vuetify.js


【解决方案1】:

这是对话框上的一个属性:

<v-dialog persistent

这将迫使他们保持打开状态,除非您通过切换模型以编程方式调用闭包。

【讨论】:

  • Vuetify 的文档说持久化道具只能防止点击外部,但你是对的,它解决了这个问题。我为没有先测试它而感到愚蠢。这是他们的文档所说的>单击元素外部不会停用它。
  • 在我的情况下,返回一页然后再次前进仍然会删除它...即使我从不更改模型
  • 如果您使用的是 v-bottom-sheet,则 vuetify 文档中有一个持久化示例
  • 如果您仍然想要 click-outside-acts-like-cancel-close ,您仍然可以在 v-dialog 上使用持久属性捕获 \@click:outside,执行您需要的任何模型检查,然后选择继续在模型中切换它或用提示打断用户等。ESC 会导致 UI 动画触发,但似乎不会触发相同的 \@click:outside。来自stackoverflow.com/questions/46281832/… 将在 v-dialog 上尝试 \@keydown.esc。
  • @storsoc 这些是完全不同的事件模式。 @keydown 方法不是为对话框捕获的可靠事件,因为事件冒泡需要交互。没有,您将无法捕获它。
猜你喜欢
  • 2019-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 2019-05-27
  • 2018-08-20
  • 1970-01-01
相关资源
最近更新 更多