如何在Ajax请求后在Rails中重新注册常见javascript事件
我正在编写一个Rails应用程序,其中包括使用jQuery的ajax功能。我希望你们能帮我 例如,在my/public/javascripts/application.js中: /* application.js */ ... $('.item-edit').editable('/item/update', { name : $(this).attr('name'), id : $(this).attr('id'), cancel : 'Cancel', submit : 'OK', indicator : 'Saving...', tooltip : 'Click to edit...', method : 'put', submitdata : {attribute : "name"} }); /*application.js*/ ... $('.item edit')。可编辑('/item/update'{ 名称:$(this.attr('name'), id:$(this.attr('id'), 取消:“取消”, 提交:“OK”, 指标:“正在保存…”, 工具提示:“单击以编辑…”, 方法:'放', submitdata:{属性:“名称”} }); 使用jEditable插件,该代码绑定已注册的元素以进行内联编辑 假设我在app/views/shared/_item_info.html.erb中有一个部分如何在Ajax请求后在Rails中重新注册常见javascript事件,javascript,jquery,ruby-on-rails,ajax,Javascript,Jquery,Ruby On Rails,Ajax,我正在编写一个Rails应用程序,其中包括使用jQuery的ajax功能。我希望你们能帮我 例如,在my/public/javascripts/application.js中: /* application.js */ ... $('.item-edit').editable('/item/update', { name : $(this).attr('name'), id : $(this).attr('id'), cancel : 'Cancel',
<!-- _item_info.html.erb -->
...
<li class="item-edit" id="<%= item.id %>"><%= item.name %> </li>
...
...
...
在第一次加载时,当单击任何“项目编辑”元素时,用户将看到一个带有“确定”按钮的内联文本框。单击“确定”后,将提交一个“放置”请求,从而保存该文本。将该文本保存到数据库中后,我们将通过调用以下部分来呈现新文本:
这就是我的update.js.erb的样子:
/* update.js.erb */
...
$("#items").html("<%= escape_javascript(render('shared/item_info')) %>")
$('.item-edit').editable('/item/update', {
name : $(this).attr('name'),
id : $(this).attr('id'),
cancel : 'Cancel',
submit : 'OK',
indicator : 'Saving...',
tooltip : 'Click to edit...',
method : 'put',
submitdata : {attribute : "name"}
});
...
/*update.js.erb*/
...
$(“#项”).html(“”)
$('.item edit')。可编辑('/item/update'{
名称:$(this.attr('name'),
id:$(this.attr('id'),
取消:“取消”,
提交:“OK”,
指标:“正在保存…”,
工具提示:“单击以编辑…”,
方法:'放',
submitdata:{属性:“名称”}
});
...
您可能已经注意到,我必须重新注册我的元素以启用内联编辑,如果没有,单击元素将不会起任何作用。我的问题是,我正在其他请求(如create.js.erb)中重新注册其他事件,这会导致大量代码重复
这个问题有什么解决办法吗?是否有一种方法可以将所有常见事件重新注册代码放在一个.js文件中,并将其包含在create.js.erb、update.js.erb…中,这样所有事件都可以重新注册,而无需复制/粘贴代码
对不起,说得太多了。如果能得到任何帮助,我将不胜感激。我提出了一个解决方案,虽然不美观,但它现在可以帮助消除代码重复 我刚刚在我的部分中添加了这一点:
<!-- _item_info.html.erb -->
...
<li class="item-edit" id="<%= item.id %>"><%= item.name %> </li>
...
<% javascript_tag do -%>
$('.item-edit').editable('/item/update', {
name : $(this).attr('name'),
id : $(this).attr('id'),
cancel : 'Cancel',
submit : 'OK',
indicator : 'Saving...',
tooltip : 'Click to edit...',
method : 'put',
submitdata : {attribute : "name"}
});
...
...
...
$('.item edit')。可编辑('/item/update'{
名称:$(this.attr('name'),
id:$(this.attr('id'),
取消:“取消”,
提交:“OK”,
指标:“正在保存…”,
工具提示:“单击以编辑…”,
方法:'放',
submitdata:{属性:“名称”}
});
...
我不再需要在我的.js.erb文件中进行任何重新注册。jQuery提供了一种很棒的方法,名为.live(docs:) 但是,由于您使用插件并调用.editable进行绑定,因此您必须修改要使用.live的jEditable的源代码,这可能(也可能不会)比它的价值更大 实际上,似乎还有其他一些非常类似的问题:
但两者都没有完美的解决方案,但值得一看是的,你可以这样做。。。或者,如果希望将javascript保存在js.erb文件中,则update.js.erb可以找到最近的.item编辑节点。如果将此节点追加到其余项的末尾,则可以对从$('.item edit')获得的数组进行索引,其长度为-1