Rails UJS – невозможно заставить jquery запускаться после первого действия

В моем представлении show.html.haml у меня есть форма, в которой пользователь может изменить несколько настроек. Я только что обновился, чтобы использовать Rails UJS, и когда мои пользователи меняют раскрывающееся меню, они видят, как jquery shizzle делает свое дело.

Все, что я на самом деле сделал в файле show.js, — это обновил партиал, в котором находится форма, и выдал сообщение об ошибке.

Проблема в том, что после того, как он был обновлен один раз, раскрывающийся список jquery не работает. Я решил, что это потому, что он отображает представление update.js, поэтому я включил этот файл. Однако по-прежнему ничего не происходит, и я не получаю никаких ошибок в журналах.

В show.html.haml у меня есть (упрощенно):

#show_form
  = render "show"        

Мое частичное шоу содержит:

= semantic_form_for @product_order, :remote => true do |f| 
  = f.select :shipping_method, options_for_select(ProductOrder::Couriers, :selected => @product_order.shipping_method)

Мои show.js.erb и update.js.erb содержат:

$("#show_form").html("<%= escape_javascript(render("show")) %>");
$("#status_banner").effect("highlight", {}, 3000);
$("#status_banner").html("<h2>ORDER STATUS: <%= (@product_order.state.titlecase) %></h2>");
$("#status_banner").removeClass("alert").addClass("alert <%= (@product_class) %>");

В моем product_order.js.coffee у меня есть это:

jQuery ->
  $("#dropdown_select").change ->
    $(this).closest("form").submit()
    $(this).serialize()
    null
    "script"
    false

Как я уже сказал, первое действие работает, но после первого обновления происходит сбой. Мое действие по обновлению контроллера немного громоздко, но я убедился, что у меня есть формат.js. Я также попытался разместить response_to: js в верхней части моего контроллера.

Я делаю это неправильно или есть простое решение, которое я не вижу?


person simonmorley    schedule 20.11.2012    source источник


Ответы (1)


Ваша проблема в том, что после обновления формы ваш js не запускается, потому что технически это новый элемент в DOM. Вам нужно будет использовать привязку события jquery следующим образом:

jQuery ->
  $("#dropdown_select").on "change", ->
    $(this).closest("form").submit()
    $(this).serialize()
    null
    "script"
    false
person Magicmarkker    schedule 20.11.2012
comment
Я понимаю, что вы имеете в виду, и пытался, но он все еще не срабатывает. Проверил и перепроверил и ничего не получил в журналах. С - person simonmorley; 20.11.2012
comment
Я также заметил, что мой раскрывающийся список не отображается правильно после первого обновления. Использую selected для красоты - после обновления получаю стандартное меню. - person simonmorley; 20.11.2012
comment
Ну, стиль для выбора не должен меняться, если библиотека, которую вы используете, не использует javascript для его изменения, тогда, однако, это проблема библиотеки с их стороны. Кроме того, попробуйте закомментировать $(this).serialize() и все, что ниже, а затем попробуйте запустить его снова. - person Magicmarkker; 20.11.2012
comment
Выбранный полагается на JS и, похоже, проигрывает и javascript, который когда-то был включен. Я пробовал, как было предложено, но безуспешно. - person simonmorley; 20.11.2012
comment
Тогда где-то должно быть что-то еще, конфликтующее с вашим кодом. В базовом приложении для рельсов вышеописанное работает для меня. - person Magicmarkker; 20.11.2012
comment
Позвольте мне снова выполнить действие моего контроллера. Я должен быть в порядке с response_to: js в моем действии обновления, верно? - person simonmorley; 20.11.2012
comment
да, это отобразит файл js, имя которого совпадает с вашим действием. Вы уверены, что нет других js, которые конфликтуют с этим и заставляют привязку события не работать? Вы уверены, что выбор, отображаемый после обновления, все еще имеет идентификатор dropdown_select? - person Magicmarkker; 20.11.2012
comment
Проверили, что идентификатор не поврежден - вместо этого собирался перейти на класс ... Как раз собирался попробовать. Я также собираюсь удалить все остальные файлы js из моего манифеста приложения. В противном случае я удалю все xs с моего контроллера. - person simonmorley; 20.11.2012
comment
давайте продолжим это обсуждение в чате - person Magicmarkker; 21.11.2012
comment
Отметили это как решенное. Спасибо за помощь и за доказательство того, что я не был на неправильном пути. Удалив обновление из обновления, все работает нормально. Пока не идеально, но с этим можно разобраться позже. С - person simonmorley; 25.11.2012