Rails UJS - 在第一次操作后无法触发jquery

时间:2012-11-20 15:17:12

标签: ruby-on-rails ruby-on-rails-3 jquery ujs

在我的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

就像我说的那样,第一个动作有效,但在第一次更新后失败了。我的控制器更新操作有点笨重,但我已确保包含format.js。我也尝试将respond_to:js放在我控制器的顶部。

我做错了还是有一个我无法看到的简单修复?

1 个答案:

答案 0 :(得分:1)

你的问题是刷新表单后,你的js没有被触发,因为从技术上来说它是DOM中的一个新元素。你需要像这样使用jquery事件绑定:

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