无休止的分页和ajax刷新
我目前有如下无休止的分页设置: 事件\u控制器.rb 除去上面的无休止的分页代码,下面是events/index.js.erb中的代码的样子,以使刷新行为正常工作: 事件/index.js.erb无休止的分页和ajax刷新,ajax,ruby-on-rails-3,pagination,kaminari,Ajax,Ruby On Rails 3,Pagination,Kaminari,我目前有如下无休止的分页设置: 事件\u控制器.rb 除去上面的无休止的分页代码,下面是events/index.js.erb中的代码的样子,以使刷新行为正常工作: 事件/index.js.erb $('#事件容器').html(''events',:locals=>{events:@events},:formats=>:html)%>'); App.poller.Event.poll(); 我的挑战是让无休止的分页代码和ajax刷新代码协同工作。如果我将ajax刷新与无休止的分页代码一起使用
$('#事件容器').html(''events',:locals=>{events:@events},:formats=>:html)%>');
App.poller.Event.poll();
我的挑战是让无休止的分页代码和ajax刷新代码协同工作。如果我将ajax刷新与无休止的分页代码一起使用,那么最终发生的事情是将重复事件附加到events tbl body元素。另一个问题是,假设用户向下滚动页面,无休止的分页将第2页的结果附加到第1页的结果,那么ajax刷新代码如何知道如何显示第1页和第2页?这些只是其中的一些挑战。希望有人能提供指导。我知道这是一个冗长的问题,因此感谢您的关注。我不完全确定“无休止的分页”这个术语,即使您不想立即显示所有内容,内容的数量是否有限制 这可能适合您:
我会用它来滚动并获得更多的结果,这是经过尝试和测试的:我发现轮询器有两种不同的用途,如果我错了,请纠正我:
我不确定第二个民意测验者会如何影响无休止页面的事件分页,但我认为这个挑战是可以解决的 我的建议是创建一个共享的AJAX方法,该方法检查内容有多旧,然后刷新特定内容(如文章、可订购项等),这段代码由分页代码或自动定时轮询调用 以情景为例
- 它允许您将“这是否需要更新”逻辑分解为一个共享函数,该函数同时容纳分页和用户保持页面静止的行为
- 它允许您确保您只更新显示的内容,并且该逻辑不会在两组函数中重复,因此您的逻辑可以在以后以最小的影响进行更新
- 当分页代码在“滚动”备份时调用此函数时有一个小的延迟,允许用户快速滚动一个元素,以至于不值得进行调用并使用服务器资源刷新屏幕上没有的内容
class EventsController < ApplicationController
respond_to :html, :js
def index
@events = Event.page(params[:page]).per(5)
respond_with(@events)
end
end
<div id="events-container">
<%= render :partial => 'events', :locals => {events: @events} %>
</div>
<div id="events-table-container" data-events-url="<%= current_url %>">
<table id="events-tbl">
<tbody id="events-tbl-body">
<%= render events %>
</tbody>
</table>
<%= paginate events %>
</div>
$(function() {
var isScrolledIntoView;
isScrolledIntoView = function(elem) {
var docViewBottom, docViewTop, elemBottom, elemTop;
docViewTop = $(window).scrollTop();
docViewBottom = docViewTop + $(window).height();
elemTop = $(elem).offset().top;
elemBottom = elemTop + $(elem).height();
return (elemTop >= docViewTop) && (elemTop <= docViewBottom);
};
if ($('#events-container .pagination').length) {
$(window).scroll(function() {
var url;
url = $('#events-container .pagination .next a').attr('href');
if (url && isScrolledIntoView('#events-container .pagination')) {
$('#events-container .pagination').html("<span class='working-notice'>Fetching more...</span>")
return $.getScript(url);
}
});
return $(window).scroll();
}
});
$('#events-tbl-body').append('<%= j render(@events) %>');
<% if (@events.current_page < @events.num_pages) %>
$('.pagination').replaceWith('<%= j paginate(@events) %>');
<% else %>
$('.pagination').remove();
<% end %>
$(document).on('ready', function() {
App.Pollers.Event.poll();
});
App.Pollers.Event = {
frequency: 170000,
poll: function() {
setTimeout(App.Pollers.Event.request, App.Pollers.Event.frequency);
},
request: function() {
eventsRequest = $.getScript($('#events-table-container').data('events-url'));
return eventsRequest;
},
};
$('#events-container').html('<%= j(render :partial => 'events', :locals => {events: @events}, :formats => :html) %>');
App.Pollers.Event.poll();