我在Rails中编写了一个非常简单的待办事项应用程序。
查看:
h2 Your todos
ul#todo_list
= render @todos
hr
h4 Add new
= form_for(Todo.new, url: {action: 'create'}, remote: true) do |form|
= form.text_field :text
= form.submit 'Add'
CoffeeScript的:
class Todo
constructor: () ->
@bindEvents()
bindEvents: () =>
console.log 'test1'
$(document).ajaxSuccess(@onAjaxSuccess)
onAjaxSuccess: (event, xhr, settings) ->
console.log 'test2'
$('#todo_list').append(xhr)
@isPresent: (element_id) ->
$("##{element_id}").length > 0
$(()->
new Todo if Todo.isPresent('todos')
)
当我创建新的待办事项时,控制台中会打印test1
。我得到了适当的200响应。不会触发@onAjaxSuccess()
方法(不会打印test2
)。为什么呢?
更新:
我刚刚看到jquery-ujs
触发了ajax:success
事件,所以我也试过了:
bindEvents: () =>
console.log 'test1'
$('#new_todo').on('ajax:success', @onAjaxSuccess)
仍然无法工作。
答案 0 :(得分:1)
@onAjaxSuccess: (event, xhr, settings) ->
应该是
onAjaxSuccess: (event, xhr, settings) ->
以便将其添加到prototype
并可通过this
答案 1 :(得分:0)
注意,尚未尝试coffeescript
。
ajax请求是否在问题的javascript
处发出?
.ajaxSuccess()
的第二个参数是jqXHR
个对象。当对象作为参数传递时,append()
似乎不会抛出错误,但不会将对象作为字符串附加到元素。
var obj = {"abc":"123"};
$("body").append(obj);
如果form
提交form.submit
时发出ajax请求,您应该可以使用$("#todo_list").append(xhr.responseText)
将ajax请求的响应附加到元素。
答案 2 :(得分:0)
问题是没有'ajax:success'
被解雇但是'ajax:error.'
在xhr中我返回了html元素并且jQuery尝试将其解析为JSON(提示:绑定到'ajax:complete'
并看看是什么你得到的错误。)
解决方案 - 更改表单的数据类型:
= form_for(Todo.new, url: {action: 'create'}, remote: true, html: { data: {type: :html} }) do |form|
= form.text_field :text
= form.submit 'Add'