我有一个js.erb文件,通过控制器操作使用ajax调用。 js.erb文件呈现部分。 partial内部是基于模型生成的数据属性。我需要一种方法来在呈现部分之后运行代码,因为代码使用了data属性中的信息。
items_controller.rb
def remove_tag
@item = Item.find_by_id(params[:id])
//code to remove tag from item
@item.save
respond_to do |format|
format.js
@item.reload
end
end
remove_tag.js.erb
$("#taglist").html('<%= escape_javascript(render partial: "items/tag_list", locals: {item: @item}) %>');
//the code below needs to be run after the above partial is rendered
$('#add-tag').rules("add", {
tagUniqueness: $('#taglist').data('tag-list').split(', ')
});
_tag_list.html.erb
<div id="taglist" data-tag-list="<%= item.all_tags_list %>">
//more html
</div>
现在的方式,.rules方法正在使用部分更新之前存在的html数据。
答案 0 :(得分:2)
要将散列或数组从Ruby转换为javascript,您可以使用.to_json
,因为JSON基本上是javascript的子集。
$('#add-tag').rules("add", {
tagUniqueness: <%= js @badge.all_tags_list.to_json %>
});
答案 1 :(得分:2)
这种类型的功能适合javascript / jquery中的callbacks
...
在当前效果100%完成后执行回调函数。
我们在ajax加载(必须保持异步)之后使用回调来执行函数。如果你能让他们工作,他们就会非常有效。
$("#taglist").html('<%= escape_javascript(render partial: "items/tag_list", locals: {item: @item}) %>').promise().done(function(){
$('#add-tag').rules("add", {
tagUniqueness: <%= js @badge.all_tags_list.to_json %>
});
});