无法绑定ajax:使用form_for ....创建的表单成功:remote => true

Reg*_*ieB 6 javascript ajax ruby-on-rails form-for

我正在使用Rails 3.1.1

我在haml视图中有以下内容:

= form_for booking.notes.build, :remote => true do |f|
  = f.text_area(:content)
  = f.hidden_field(:noteable_id)
  = f.hidden_field(:noteable_type)
  = f.submit('Add note')
Run Code Online (Sandbox Code Playgroud)

这会在提交时创建新笔记.此外,我的控制器的响应正在Chrome控制台(网络标签)中正确显示.但我似乎无法抓住回应.

我想在提交后更新页面上的注释列表.我一直试图绑定到ajax响应,所以我可以抓住响应,但我失败了.例如,我认为这应该有效,但不是:

$('#new_note').bind('ajax:success', function() {
  alert('Hi');
});
Run Code Online (Sandbox Code Playgroud)

但是没有触发警报.我认为这解释了为什么这也行不通.

 $('#new_note').bind("ajax:success", function(evt, data, status, xhr){
  // Insert response partial into page below the form.
  $(this).parent.append(xhr.responseText);

})
Run Code Online (Sandbox Code Playgroud)

你能指点一下可能出现的问题吗?

egz*_*gze 9

你试过'ajax:complete'吗?

其他可能出错的地方:

状态代码并非真正"成功".这触发了jQuery的成功

if ( status >= 200 && status < 300 || status === 304 ) {
Run Code Online (Sandbox Code Playgroud)

或者在呈现表单之前评估事件处理程序.尝试事件委托:

$("body").on('ajax:success', '#new_note', function(){...})
Run Code Online (Sandbox Code Playgroud)

(小心,这是新的jQuery语法.如果使用旧的jQuery,请相应调整)


And*_*i S 0

这通常是通过create.js.erb在控制器的视图部分中创建一个文件来完成的(如果还没有这样做),您可以在其中访问创建操作中产生的任何变量,并且可以在那里渲染 html

在你的create.js.erb文件中你可以写类似的东西

$("#new_note").html('<%= escape_javascript(render partial: "path/to/partial") %>');
Run Code Online (Sandbox Code Playgroud)

阅读我前段时间写的这篇文章,它几乎解释了整个流程

  • 这是否“通常是这样做的”是有争议的。我个人认为这是一种不好的做法,它会降低代码的可维护性。JS 应该转到它所属的资产文件夹。 (4认同)