Twitter bootstrap jquery.on(“show.bs.modal”,m.redraw)会破坏对话框

Twitter bootstrap jquery.on(“show.bs.modal”,m.redraw)会破坏对话框,twitter-bootstrap,twitter-bootstrap-3,jquery-plugins,bootstrap-modal,mithril.js,Twitter Bootstrap,Twitter Bootstrap 3,Jquery Plugins,Bootstrap Modal,Mithril.js,我正试着用Twitter引导Mithril。通常使用Mithril包装的引导程序重新绘制对话框是可行的,但是在“show.bs.modal”事件的处理程序中重新绘制会隐藏离开背景的对话框。即使使用setTimeout,也无法解决此问题,因为它应该提供不同的执行上下文。为什么以及如何修复它 这里是一个简单的PoC 要点: Rawgit(工作演示): 简言之,这是行不通的 jquery.on("shown.bs.modal", () => setTimeout(m.redraw, 2000))

我正试着用Twitter引导Mithril。通常使用Mithril包装的引导程序重新绘制对话框是可行的,但是在
“show.bs.modal”
事件的处理程序中重新绘制会隐藏离开背景的对话框。即使使用
setTimeout
,也无法解决此问题,因为它应该提供不同的执行上下文。为什么以及如何修复它

这里是一个简单的PoC

要点:

Rawgit(工作演示):

简言之,这是行不通的

jquery.on("shown.bs.modal", () => setTimeout(m.redraw, 2000));

m.redraw
仅适用于已安装或的

我对您的代码做了一些更改:

  • 如果我们将虚拟DOM代码放在组件视图中,并将
    m.render
    更改为
    m.mount
    ,那么我们可以将
    f
    替换为
    m.redraw
  • 我添加了一个draw计数器,以指示代码按预期重新执行
  • 非函数的DOM属性,如
    className
    type
    等,可以在
    m()中表示

已解决:
m.render
覆盖
类名
,该类名被
$(element.modal(“show”)
更改,因此必须防止出现这种情况。您有两个选择:

  • $(element.modal(“show”)
    之后获取
    className
    ,并将其反映到模型中
  • initialized
    为false时,在
    config
    中设置
    className
  • 我选择2。如下所示:

    m("div", {
      config(element, initialized) {
        if (!initialized) {
          element.className = "modal fade";
          $(element)
            .on("shown.bs.modal", () => setTimeout(m.redraw, 2000))
            .modal("show");
        }
      }
    }, conentOfTheModalDialog);
    

    谢谢,我对PoC应用了一些更改。但是它并不能解决问题。我认为问题在于你不能使
    setTimeout(m.redraw)
    工作。如果你看一下,你会发现这个数字在2秒后会增加(而且每次你点击这个按钮都会增加一次)。还缺少什么?