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

Rails 4 - event to run code after a partial is rendered

我有一个 js.erb 文件,它通过控制器操作用 ajax 调用。 js.erb 文件呈现部分。部分内部是根据模型生成的数据属性。我需要一种方法来 运行 仅在呈现部分后才编写代码,因为代码使用数据属性中的信息。

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 在部分更新之前存在的数据。

要将散列或数组从 Ruby 转换为 javascript,您可以使用 .to_json,因为 JSON 基本上是 javascript 的子集。

$('#add-tag').rules("add", {
  tagUniqueness: <%= js @badge.all_tags_list.to_json %>
});

这种类型的功能适合 callbacks 在 javascript/jquery...

A callback function is executed after the current effect is 100% finished.

我们使用回调在 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 %>
    });
});