2012-02-29 1 views
0

У меня есть форма Rails 3 AJAX в диалоговом окне SimpleModal, которое добавляет строку в таблицу каждый раз, когда она отправляется. Я использую ненавязчивый подход jquery-ujs. До сих пор:Rails 3 + SimpleModal + AJAX: кнопка отправки работает только один раз

  • Форма AJAX работает любое количество раз, если она не находится в диалоговом окне.

  • Он работает ровно один раз, если он находится в диалоговом окне SimpleModal. После этого кнопка отправки перестает работать. Никаких сообщений, ошибок нет, ничего нет, хотя он отлично работает при отправке вручную из консоли js, то есть $ ('...'). Submit();

Ощущается как обработчик события упал, когда SimpleModal перемещает HTML в диалоговом окне, но все в jquery-ujs source выглядит как метод .delegate(), так что я не знаю, почему он не получит повторное подключение.

Я подозреваю, что есть очень простое решение, что-то, о чем я просто не знаю, решает проблему примерно в двадцать персонажей.

Вот соответствующий код:

Page JS (приложение/активы/JavaScripts/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 

И, наконец, JS, что он реагирует с (приложение/просмотров/вяжущего/create.js.erb):

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

ответ

0

Я в конечном итоге того, чтобы рыть в SimpleModal яваскрипта источник немного. Не было волшебной пули. Это просто вопрос отладки и отслеживания происходящего.

0

беглого удар по возможности (без более тщательного понимания того, что вы делаете): подумайте, нужно ли вам использовать метод .live (...), а не просто .click (...). Вернее, в .on() или .delegate() в зависимости от того, какую версию jQuery вы используете.

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

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

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

+0

Спасибо. Я знаю, что это вопрос неясный. Не уверен, что это все сделает. Событие «click» находится по ссылке, которая открывает диалоговое окно, поэтому оно никуда не денется. Это кнопка В диалоговом окне, которая перемещается и не выполняется. – Ricky