Rails 4 - 渲染部分后运行代码的事件

时间:2016-01-21 01:20:08

标签: javascript jquery ruby-on-rails ajax partials

我有一个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数据。

2 个答案:

答案 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加载(必须保持异步)之后使用回调来执行函数。如果你能让他们工作,他们就会非常有效。

great reference here

$("#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 %>
    });
});