2012-02-29 59 views
0

我在一个SimpleModal对话框中有一个Rails 3 AJAX表单,每次提交时它都会向表中添加一行。我使用了不显眼的jquery-ujs方法。到目前为止:Rails 3 + SimpleModal + AJAX:提交按钮只能工作一次

  • 如果不在对话框中,AJAX表单可以工作多次。

  • 如果它位于SimpleModal对话框中,它只能使用一次。之后,提交按钮停止工作。没有提交,没有错误,没有任何东西,虽然它从js控制台手动提交时工作正常,即$('...')。submit();

感觉就像一个事件处理程序被删除时SimpleModal移动HTML来一个对话框,但一切都在jquery-ujs source看起来像一个.delegate()方法,所以我不知道为什么它不会得到重新连接。

我怀疑有一个非常简单的解决方案,我只是没有意识到,解决了大约20个字符的问题。

下面是相关代码:

页JS(应用程序/资产/ Java脚本/ binders.js):

$(function() { 

    // Hide the form initially: 
    $('#add_binder_modal').hide(); 

    // Show as SimpleModal when add link clicked: 
    $('#add_binder_link').click(function(event) { 
    event.preventDefault(); 
    $('#add_binder_modal').modal(); 
    }); 

    // Close on success: 
    $("form").bind("ajax:success", function(xhr, data, status){ 
    $.modal.close(); 
    }); 
}); 

这里是我的Rails形式(应用程序/视图/粘合剂/ _form.js):

#add_binder_modal.container 
    = form_for Binder.new, :remote=>true do |f| 
    = f.text_field :subject 
    = f.submit 

我不认为你需要它,但为了以防万一,这里的控制器(应用程序/控制器/ binders_controller.rb):

class BindersController < ApplicationController 
    respond_to :html, :js 

    def create 
    @binder = Binder.new(params[:binder]) 
    @binder.save 

    respond_to do |format| 
     format.html { redirect_to binders_path } 
     format.js 
    end 
    end 

end 

最后,它与(应用程序/视图/粘合剂/ create.js.erb)响应的JS:

$('<%= escape_javascript(render(:partial => 'show', :locals=>{:binder=>@binder}))%>') 
    .appendTo('.binders .atable tbody').hide().fadeIn(); 

回答

0

我最后不得不挖入simplemodal JavaScript源比特。没有魔法弹。这只是调试和追踪发生的事情。

0

在有可能以快速的刺(没有更彻底地了解你在做什么):考虑是否需要使用.live(...)方法而不是.click(...)。或者说,.on()或.delegate()取决于您使用的jQuery版本。

http://api.jquery.com/live/

http://api.jquery.com/on/

http://api.jquery.com/delegate/

+0

谢谢。我知道这是一个晦涩的问题。不知道会做到这一点。 'click'事件在打开对话框的链接上,所以它不会在任何地方发生。这是对话框中的按钮被转移并且无法执行。 – Ricky 2012-02-29 22:57:13