2011-11-30 15 views
5

के साथ एक अंतहीन स्क्रॉल को कार्यान्वित करना मैं अपनी परियोजना पर एक अंतहीन स्क्रॉल को लागू करने की कोशिश कर रहा हूं। मैं रेलस्कास्ट #114 Endless Page और this का मिश्रण उपयोग कर रहा हूं।रेल 3 और Jquery

जब भी पृष्ठ समाप्त होता है तो अनुरोध भेजने को रोकने का प्रयास करते समय सबकुछ अजीब व्यवहार के अलावा ठीक काम करता है।

अब तक मेरे पास है:

नियंत्रक:

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

जावास्क्रिप्ट (आंशिक के माध्यम से भरी हुई):

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

शो .js.erb

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

आप देख सकते हैं, मेरे 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) %>"); को चलने से भी रोक रहा है।

यह नियंत्रक को अनुरोध भेजता है, एसक्यूएल चलाता है लेकिन अंतिम पृष्ठ को जोड़ता नहीं है।

यदि मैं @photos.total_pages < params[:page].to_i() पर स्थिति बदलता हूं तो यह काम करता है, लेकिन उस पृष्ठ पर अतिरिक्त अनुरोध भेजता है जो मौजूद नहीं है।

मैं अपने कार्यान्वयन पर किसी भी मदद की सराहना करता हूं। मुझे यकीन नहीं है कि इसे पूरा करने के लिए पर्याप्त (रेल) तरीका है या नहीं।

+0

मैं रेल पता नहीं है, लेकिन आम तौर पैरामीटर नहीं है [: पृष्ठ] .to_i() शून्य-आधारित इंडेक्स? तो अगर पैराम्स [: पेज] .to_i() उदाहरण 5 के लिए है, तो photos.total_pages 6 (पेज 0-5) होंगे। – Simon

+0

क्या आपने पिछले पृष्ठ पर '@ photos' चर का निरीक्षण किया है? मुझे लगता है कि यह कुछ भी नहीं जोड़ रहा है क्योंकि संग्रह पिछले पृष्ठ पर खाली है। आपके द्वारा चिपकाए गए किसी भी कोड द्वारा 'फिनिश' वेरिएबल का उपयोग नहीं किया जाता है, लेकिन मुझे नहीं लगता कि यह संबंधित है। – Draiken

+0

आपके AJAX कॉल में आपके पास सफलता विधि है जहां आप केवल लोडिंग को गलत पर सेट करते हैं। प्रतिक्रिया कहां जाती है? यदि इसे डीओएम में इंजेक्शन नहीं दिया गया है तो परिवर्तनीय नहीं बदला जाएगा। – Zefiryn

उत्तर

2

सबसे पहले आप आंशिक रूप से एचटीएमएल प्रदान कर सकते हैं जब अनुरोध 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 

फिर ajax कॉल का उपयोग करें:

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