Можно ли часто обновлять частичное использование Ajax?
В фоновом режиме я хочу, чтобы он перезагружался и показывал число, сколько непрочитанных сообщений есть.
Я хочу это без обновления страницы. Я имею в виду использование ajax.
Если бы у меня было это в меню, как я могу обновить только этот раздел каждые 30 секунд?
<li><%= link_to sanitize('<i class="icon-envelope"></i> ') + "received messages" + sanitize(' <span class="badge badge-info">'+current_user.mailbox.inbox(:read => false).count(:id, :distinct => true).to_s+'</span>'), messages_received_path %></li>
messages_controller.rb
def received
if params[:search]
@messages = current_user.mailbox.inbox.search_messages(@search).page(params[:page]).per(10)
else
@messages = current_user.mailbox.inbox.page(params[:page]).per(10)
end
add_crumb 'Messages Received', messages_received_path
@box = 'inbox'
render :index
end
UPDATE: _______________________________
активы/JavaScript/refresh_messages_count.js
$(document).ready(function () {
// will call refreshPartial every 3 seconds
setInterval(refreshPartial, 3000)
});
function refreshPartial() {
$.ajax({
url: "messages/refresh_part";
})
}
messages_controller.rb
def refresh_part
@message_count = current_user.mailbox.inbox(:read => false).count(:id, :distinct => true)
# get whatever data you need to a variable named @data
respond_to do |format|
format.js {render :action=>"refresh_part.js"}
end
end
Виды/макеты/_menu.html.erb
<span id="message_received_count"><%= render :partial => "layouts/message_received_count" %></span>
Виды/макеты/_message_received_count.html.erb
<% if user_signed_in? && current_user.mailbox.inbox(:read => false).count(:id, :distinct => true) > 0 %>
<li><%= link_to sanitize('<i class="icon-envelope"></i> ') + "Received" + sanitize(' <span class="badge badge-info">'[email protected]_count.to_s+'</span>'), messages_received_path %></li>
<% else %>
<li><%= link_to sanitize('<i class="icon-envelope"></i> ') + "Received", messages_received_path %></li>
<% end %>
мнения/сообщения/refresh_part.js.erb
$('#message_received_count').html("#{escape_javascript(render 'layouts/messages_received_count', data: @message_count)}");
Ответы
Ответ 1
Вы будете использовать setInterval для отправки запроса ajax:
$(document).ready(function () {
// will call refreshPartial every 3 seconds
setInterval(refreshPartial, 3000)
});
// calls action refreshing the partial
function refreshPartial() {
$.ajax({
url: "whatever_controller/refresh_part"
})
}
Затем вы делаете действие в контроллере следующим образом:
def refresh_part
# get whatever data you need to a variable named @data
respond_to do |format|
format.js
end
end
тогда вы напишете файл js с именем refresh_part.js.haml
(вы можете использовать erb вместо haml).
refresh_part.js.haml будет выглядеть так:
$('#part_you_want_to_refresh').html("#{escape_javascript(render 'name_of_partial', data: @data)}");
убедитесь, что вы установили правильные маршруты в routes.rb
.
Ответ 2
FYI, refresh_part.js.erb будет выглядеть так:
$("#part").html("<%= escape_javascript(render 'partial', data: @data) %>");
вместо:
$('#part').html("#{escape_javascript(render 'partial', data: @data)}");
Кроме того, мы можем использовать псевдоним "escape_javascript", чтобы упростить это:
$("#part").html("<%= j(render 'partial', data: @data) %>");
Ответ 3
Да, вы можете
<html>
<head>
<script type="text/JavaScript">
<!--
function timedRefresh(timeoutPeriod) {
setTimeout("location.reload(true);",timeoutPeriod);
}
// -->
</script>
</head>
<body onload="JavaScript:timedRefresh(5000);">
<p>This page will refresh every 5 seconds. This is because we're using the 'onload' event to call our function. We are passing in the value '5000', which equals 5 seconds.</p>
<p>But hey, try not to annoy your users too much with unnecessary page refreshes every few seconds!</p>
</body>
</html>
Источник: http://www.quackit.com/javascript/javascript_refresh_page.cfm