ruby-on-rails 使用内置的show()和hide()函数后,Flowbite模式无法再次打开

enxuqcxy  于 5个月前  发布在  Ruby
关注(0)|答案(1)|浏览(93)

我使用Flowbite modals向用户显示注册和登录表单。在每个modals的底部都有一个按钮可以切换到另一个,例如“不是会员?注册。”或“已经有帐户?登录。
100d 1xx 1c 1d 1x的字符串
这些按钮触发onclick事件到函数toggleSignInSignUpModals(),如下所示:

function toggleSignInSignUpModals(e) {
  // Hard coded these here for ease of understanding. //
  var currentModalName = "authentication-modal";
  var otherModalName = "sign-in-modal";
  /////////////////////////////////////////////////////
  var currentModalElem = document.getElementById(currentModalName);
  var otherModalElem = document.getElementById(otherModalName);

  const options = {
    placement: 'center',
    backdrop: 'dynamic',
    backdropClasses:
        'bg-gray-900/50 dark:bg-gray-900/80 fixed inset-0 z-40',
    closable: !0,
    onHide: function() {},
    onShow: function() {},
    onToggle: function() {}
  };

  var currentModalObj = new Modal(currentModalElem, options);
  currentModalObj.hide();

  var otherModalObj = new Modal(otherModalElem, options);
  otherModalObj.show();
}

字符串
在这个函数中,我使用了内置的Flowbite函数hide()show()来在2个模态之间切换。
在两个模块之间切换时,此功能正常工作。但是,在您切换并关闭它们之后,两个模块都停止运行(如下所示):


*注意: 在这一点上值得一提的是,当在此上下文之外使用模态时(不使用我的自定义函数),模态可以完美地工作。

作为参考,here是正在使用的Flowbite JavaScript。

  • hide()函数可以在2191行中看到,
  • show()函数可以在2189行中看到,
  • 我认为所有的模态都是从2106行开始的,
    我尝试过的主要内容:
  • 我尝试在onclick函数之外示例化modals,以避免每次用户在两个modals之间切换时都重新创建它们。这导致modals第二次成功打开,但随后无法正确关闭(modal overlay未被删除)。
  • 我有一种预感,这与Flowbite如何创建和销毁Modal对象有关,也许我需要调用除了hide()show()之外的其他方法。
  • 隐藏时设置isHidden = true,显示时设置isHidden = false
  • 在我们隐藏的模态上调用destroy()
  • 在我们隐藏的模态上调用destroyAndRemoveInstance()
  • 在我们隐藏的模态上调用removeInstance()
  • 在两个模态上调用toggle(),而不是hide()show()
  • 我还怀疑这是因为事件侦听器没有使用hide()show()正确重置,但查看这两个函数显示_removeModalCloseEventListeners()_setupModalCloseEventListeners()都被调用。
    **TLDR;**我如何让这些modals正常工作?:)提前谢谢你。
rmbxnbpk

rmbxnbpk1#

我找到了一个解决方案(在Flowbite的founder的帮助下,谢谢你先生!)。
toggleSignInSignUpModals()函数中:我正在创建新的Modal对象**,除了页面上已经存在的对象**。这导致Modal示例的show()hide()函数被调用两次。
更具体地说:

  • 在退出modals时,两个示例都没有eventListenerInstance,这意味着用户无法再次打开它。
  • 在退出modals时,屏幕上的最后一个modal在退出之前被设置为isHidden = false,进一步导致这一行在函数_destroyBackdropEl()中失败。

从本质上讲,由于在每个模态上调用所有内容两次,模态状态都被顶起来了。
下面是我的(工作)代码:

function toggleSignInSignUpModals(e) {
  var currentModalName = "some-name";
  var otherModalName = "some-other-name";

  var currentModalObj = FlowbiteInstances.getInstance('Modal', currentModalName);
  var otherModalObj = FlowbiteInstances.getInstance('Modal', otherModalName);

  currentModalObj.hide();
  otherModalObj.show();
}

字符串
这不是创建新的Modal示例,而是查找页面上已经存在的示例并直接处理它们。
再次感谢Zoltán Szgyényi在这方面的帮助!

相关问题