我读了Bootstrap网站上的帖子,疯狂地谷歌了一下——但我肯定找不到一个简单的答案……

我有一个Bootstrap模式,我从一个link_to helper像这样打开:

<%= link_to "New Contact", new_contact_path, {remote: true, 'data-toggle' => 'modal', 'data-target' => "#myModal",  class: "btn btn-primary"} %>

在我的ContactsController中。创建动作,我有创建联系人的代码,然后传递给create.js.erb。在create.js。erb,我有一些错误处理代码(ruby和javascript的混合)。如果一切顺利,我想关闭模态。

这就是我遇到麻烦的地方。当一切顺利的时候,我似乎不能放弃模态。

我尝试了$('#myModal').modal('hide');这没有任何影响。我还尝试了$('#myModal').hide();这导致模态解散,但留下背景。

关于如何在create.js.erb中关闭模式和/或解散背景,有什么指导吗?

Edit

下面是myModal的标记:

<div class="modal hide" id="myModal" >
  <div class="modal-header">
    <a class="close" data-dismiss="modal">×</a>
    <h3>Add Contact</h3>
    <div id="errors_notification">
    </div>
  </div>
  <div class="modal-body">
    <%= form_for :contact, url: contacts_path, remote: true do |f| %>  
      <%= f.text_field :first_name, placeholder: "first name" %>
      <%= f.text_field :last_name, placeholder: "last name" %>
      <br>
      <%= f.submit "Save", name: 'save', class: "btn btn-primary" %>
      <a class="close btn" data-dismiss="modal">Cancel</a>
    <% end %>
  </div>
  <div class="modal-footer">
  </div>
</div>

当前回答

隐藏模式背景工作,但随后打开模式和背景不像它应该隐藏。我发现这种方法始终有效:

// SHOW
$('#myModal').modal('show')
$('.modal-backdrop').show();

// HIDE
$('#myModal').modal('hide');
$('.modal-backdrop').hide();

其他回答

我用了这个代码-

隐藏模式与平滑效果使用淡出。

$('#myModal').fadeOut();

$('.modal-backdrop').fadeOut();

$('.modal-open').css({'overflow': 'visible'});

我有更好的运气在“显示”回调发生后进行调用:

$('#myModal').on('shown', function () {
      $('#myModal').modal('hide');
})

这确保了模态在调用hide()之前完成加载。

我也遇到过类似的问题。$ (' # myModal ') .modal(隐藏的);很可能运行该函数并命中该行

if (!this.isShown || e.isDefaultPrevented()) return

问题是,即使显示了模态,且该值应该为真,isshows值也可能是未定义的。我对引导代码进行了如下修改

if (!(typeof this.isShown == 'undefined') && (!this.isShown || e.isDefaultPrevented())) return

这似乎在很大程度上解决了问题。如果背景仍然存在,你可以在$('.modal- background ').remove();;后添加一个调用来手动删除它。一点也不理想,但确实有用。

$('.modal-backdrop').hide(); // for black background
$('body').removeClass('modal-open'); // For scroll run
$('#modal').modal('hide'); 

我们发现,在对服务器代码的调用和返回成功回调之间只有轻微的延迟。如果我们将对服务器的调用包装在$("#myModal").on('hidden.bs. 'modal',函数(e)处理程序,然后调用$("#myModal").modal("hide");方法,浏览器将隐藏模式,然后调用服务器端代码。

同样,不是优雅,而是实用。

 function myFunc(){
        $("#myModal").on('hidden.bs.modal', function (e) {
            // Invoke your server side code here.
        });
        $("#myModal").modal("hide");
 };

如您所见,当myFunc被调用时,它将隐藏模式,然后调用服务器端代码。