2016-01-21 60 views
0

我有一個js.erb文件,通過控制器操作使用ajax調用。 js.erb文件呈現一個部分。部分內部是根據模型生成的數據屬性。我需要一種方法才能在局部呈現後運行代碼,因爲代碼正在使用data屬性中的信息。Rails 4 - 部分渲染後運行代碼的事件

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

你的觀點應該簡單地目前的模式。如果你的觀點正在改變模型,那麼你犯了一個非常錯誤的做法,因爲嚴重違反了MVC。 – max

+0

我的看法是不改變模型,模型是通過remove_tag動作改變的。 – user4584963

+0

'tagUniqueness:「<%= @ item.tags.pluck(:name).join(',')%>」' - 看起來像一個更直接的解決方案,因爲您可以從軌道而不是DOM獲得它。 – max

回答

2

要將哈希或數組從Ruby轉換爲JavaScript,您可以使用.to_json,因爲JSON基本上是javascript的子集。

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

我使用'raw'而不是'js'。這個比那個好嗎? – user4584963

+0

在這種情況下,它可能沒有什麼區別 - 我不認爲你可以通過創建一個真正有創意的標籤名稱來進行XSS攻擊,因爲編碼爲JSON將會逃脫它。 'raw'可能會更快,因爲它不使用'gsub'或實際上對字符串做任何事情,除了將其標記爲安全外。 – max

2

這種類型的功能適合以callbacks在javascript/jquery的...

的回調函數在電流作用之後執行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 %> 
    }); 
});