Rails 3 + SimpleModal + AJAX: кнопка отправки работает только один раз - PullRequest
0 голосов
/ 01 марта 2012

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

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

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

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

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

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

Страница js (app / assets / 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 (app / views / binders / _form.js):

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

Не думаю, что вам это понадобится, но на всякий случай вот контроллер (app / controllers / 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, на который он отвечает (app / views / binders / create.js.erb):

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

Ответы [ 2 ]

0 голосов
/ 14 декабря 2012

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

0 голосов
/ 01 марта 2012

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

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

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

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

...