我开始在我的Rails应用程序中使用Hotwire,并实现了类似于教程视频的功能,在其中提交表单并刷新页面的另一部分。就像视频中一样,我不得不实现自己的重置表单控制器:
import {Controller} from "stimulus"
export default class extends Controller {
reset() {
this.element.reset()
}
}
重置表单中的值。表单大致如下:
<%= form_with(model: @invitation,
data: {controller: "reset-form",
action: "turbo:submit-end->reset-form#reset"}) do |form| %>
<!-- other form elements -->
<%= form.submit "Invite" %>
<% end %>
它会生成如下所示的按钮:
<input type="submit" name="commit" value="Invite" data-disable-with="Invite">
因为有一个{{data-disable-with}},当你按下按钮时,它会被禁用以避免双重提交,这很好。问题在于{{this.element.reset()}}无法重置它。
应该如何正确处理这个问题?
我不是在寻找解决方法,我知道很多种,但我正在寻找解决这个问题的干净方法。
这个按钮的禁用是由UJS引起的吗?这意味着在Stimulus应用程序中不应使用UJS吗?
我可以从{{reset}} JavaScript函数重新启用按钮,但如果输入按钮是这样指定的:
<%= form.submit "Invite", data: {disable_with: "Inviting, please wait..."} %>
然后按钮的原始标签(value
)会丢失,我没有重新建立它的方法,这让我想到实现此功能的任何内容(UJS?)都不适用于hotwire/spa应用程序,并且需要完全重新加载页面。
我可以简单地抛出:
config.action_view.automatically_disable_submit_tag = false
我想用Stimulus控制器实现自己的双击预防,但这种做法感觉不太对。问题不在于属性data-disable-with
,而是它是如何实现的。