2016-01-21 3 views
0

У меня есть файл js.erb, который вызывается с помощью ajax через действие контроллера. Файл js.erb делает частичным. Внутри частичного является атрибут данных, который создается на основе модели. Мне нужен способ запускать код только после того, как частичная обработка отображается, потому что код использует информацию в атрибуте данных.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 %> 
    }); 
}); 
Смежные вопросы