2013-01-31 60 views
1

在使用best_in_place更新DOM元素后,需要更新的表中有不同的值。在最佳就地更新之后,如何触发像“create.js.erb”这样的名为“update.js.erb”的JavaScript动作?best_in_place update后更新各种DOM元素

例如,我有一个项目价格表,我需要在用户更新单个项目数量后更新表格的“总计”字段。

回答

7

我见过很多人问这个问题,但还没有找到满意的解决方案。我发现最好的方法是创建一个javascript函数,该函数监视特定DOM元素在ajax:success后更新,然后使用jQuery更新指定的DOM元素。

在正在更新的项目的控制器中,我打包了一个JSON响应,其中包含我的JavaScript将用于更新DOM元素的所有信息。

你会看到我也将新表行的部分呈现为HTML字符串,并将此字符串与JSON响应一起传递。

___Item Controller_____ 

    respond_to do |format| 
    if @item.update_attributes(params[:item]) 

    #json response variables to refresh table row after update 
    id = [@item] 
    new_row = render_to_string('items/_item.html', :layout => false, :locals => { :item => @item }) 
    #----------json-variables-----------# 

    format.json { render :json => { new_row: new_row, id: id, :status => 200 }} 
    format.js 
    else 
    format.json { render :json => @item.errors.full_messages, :status => :unprocessable_entity } 
    format.js 
    end 
end 

然后在被加载的页面(如application.js中).js文件,我包括手表带班“row_class”要更新的表行的功能。

$(document).ready(function(row_class, row_id_prefix){ 

$("." + row_class).on("ajax:success",function(event, data, status, xhr){ 
    var parsed_data = jQuery.parseJSON(data); //parses string returned by controller into json object 

    var id = parsed_data["id"]; 
    var new_row = parsed_data["new_row"]; //this is an html string that replaces the existing table row 

    $('tr#' + row_id_prefix + id).replaceWith(new_row); 
    $('tr#' + row_id_prefix + id).effect('highlight'); 
    $('.best_in_place').best_in_place(); //activates in-place-editing for newly added content.  
}));   

您可以修改jQuery来更新您需要的任何DOM元素。此外,如果您需要在对象上调用的ruby方法的结果(例如人性化总数,税务总额等),则可以将其定义为控制器中JSON对象中的变量。

最终,如果best_in_place会触发(在本例中)items/update.js.erb脚本,但它看起来不像路线图中那样。

+0

这是令人沮丧的考虑我需要更新某些页面不同的方式...使这样一个捕获所有将打破其他人。 :( –