2011-11-30 4 views
5

Estoy tratando de implementar un desplazamiento sin fin en mi proyecto. Estoy usando una mezcla de Railscast #114 Endless Page y this.Implementación de un desplazamiento sin fin con Rails 3 y Jquery

Todo funciona bien, además de un comportamiento extraño cuando trato de dejar de enviar solicitudes cuando la página llega a su fin.

hasta ahora tengo:

controlador:

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 (cargado a través parcial):

<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> 

espectáculo .js.erb

$("#photos_container").append("<%= escape_javascript(render :partial => 'photo', :collection => @photos) %>"); 
<% if @photos.total_pages == params[:page].to_i() %> 
    page.call 'finish' 
<% end %> 

Como se puede ver, en mi show.js.erb Tengo un page.call que asigna a la variable verdadera finish. Esto detiene las solicitudes.

Lo que ocurre es que nunca carga la última página. Cuando @photos.total_pages == params[:page].to_i() en lugar de simplemente llamar a la función finish y establecer la variable en true, también impide que se ejecute $("#photos_container").append("<%= escape_javascript(render :partial => 'photo', :collection => @photos) %>");.

Envía la solicitud al controlador, ejecuta el SQL pero no agrega la última página.

Si cambio la condición a @photos.total_pages < params[:page].to_i() funciona, pero envíe una solicitud adicional a una página que no existe.

Agradecería cualquier ayuda en mi implementación. No estoy seguro de si hay una manera más adecuada (Rails) para lograr esto.

+0

No sé rieles, pero en general no es params [: page] .to_i() ¿un índice basado en cero? entonces si params [: page] .to_i() es por ejemplo 5, entonces photos.total_pages sería 6 (páginas 0-5). – Simon

+0

¿Ha inspeccionado la variable '@ photos' en la última página? Creo que no se agrega nada porque la colección está vacía en la última página. La variable 'finish' no es utilizada por ningún código que hayas pegado también, pero no creo que esté relacionado. – Draiken

+0

En su llamada ajax tiene un método de éxito en el que solo establece la carga en falso. ¿A dónde va la respuesta? Si no se inyecta en el DOM, la variable no se cambiará. – Zefiryn

Respuesta

2

En primer lugar se puede representar HTML de la solicitud es parcial cuando el tipo xhr:

def show 
    photoset = Photoset.includes(:photos).find(params[:id]) 
    @title = photoset.name 
    @photos = photoset.photo.paginate(:page => params[:page], :per_page => 20) 
    if request.xhr? 
    render '_photo', :layout => false 
    end 
end 

Entonces utilizar AJAX llamada:

$.ajax({ 
    url: '/photosets/<%= params[:id] %>?page=' + page, 
    type: 'get', 
    dataType: 'script', 
    success: function(response) { 
    $("#photos_container").append(response); 
    if (response == "") { 
     //stop calling endless scroll 
    } 
    }); 
});