プロジェクトに無限スクロールを実装しようとしています。Railscast #114 Endless Pageとthisを組み合わせて使用しています。
ページが最後に達したときにリクエストの送信を停止しようとすると、奇妙な動作以外はすべて正常に機能します。
これまでのところ、私は持っています:
コントローラ:
def show
@title = Photoset.find(params[:id]).name
@photos = Photoset.find(params[:id]).photo.paginate(:page => params[:page], :per_page => 20)
respond_to do |format|
format.js
format.html
end
end
Show.html.erb:
<% content_for :body_class, '' %>
<%= render 'shared/header' %>
<div id="photos_container">
<div id="photos_header">
<h2><%= @title %></h2>
</div>
<%= render :partial => 'photo', :collection => @photos %>
</div>
<%= render :partial => 'endless_scroll' %>
Javascript (部分的にロード):
<script type="text/javascript">
(function() {
var page = 1,
loading = false,
finish = false;
function nearBottomOfPage() {
return $(window).scrollTop() > $(document).height() - $(window).height() - 200;
}
function finish() {
finish = true;
}
$(window).scroll(function(){
if (loading) {
return;
}
if(nearBottomOfPage() && !finish) {
loading=true;
page++;
$.ajax({
url: '/photosets/<%= params[:id] %>?page=' + page,
type: 'get',
dataType: 'script',
success: function() {
loading=false;
}
});
}
});
}());
</script>
show.js.erb
$("#photos_container").append("<%= escape_javascript(render :partial => 'photo', :collection => @photos) %>");
<% if @photos.total_pages == params[:page].to_i() %>
page.call 'finish'
<% end %>
ご覧のとおり、変数に true を代入する がありshow.js.erb
ます。これにより、リクエストが停止します。page.call
finish
有線の問題は、最後のページをロードしないことです。@photos.total_pages == params[:page].to_i()
関数を呼び出してfinish
変数を に設定するだけでなく、true
の実行も妨げて$("#photos_container").append("<%= escape_javascript(render :partial => 'photo', :collection => @photos) %>");
います。
リクエストをコントローラーに送信し、SQL を実行しますが、最後のページを追加しません。
条件を変更する@photos.total_pages < params[:page].to_i()
と機能しますが、存在しないページに追加のリクエストを送信します。
私の実装について何か助けていただければ幸いです。これを達成するためのより適切な (Rails) 方法があるかどうかはわかりません。