0

ホームハンドラーの呼び出しが行われるたびに同じカーソルが生成されていることを appengine ログから確認しました。以下は私のコードのスニペットです:

class HomeHandler(webapp2.RequestHandler):
def get(self):
    #page=self.request.get("page", default_value="1");
    q = Allnews.query().order(-Allnews.date_added)
    cursor = ndb.Cursor(urlsafe=self.request.get('cursor',default_value=None))
    items, next_curs, more = q.fetch_page(30, start_cursor=cursor)
    if more:
        next_c = next_curs.urlsafe()
    else:
        next_c = None
    context = { "news":items,"cursor":next_c}
    # context["headlines"]=Feed.query(Feed.feed_cat.title == 'Headlines')
    # context["gossip"] = Feed.query(Feed.feed_cat.title == 'Gossip')
    # context["sports"] = Feed.query(Feed.feed_cat.title == 'Sports')
    self.response.out.write(template.render('templates/homefeed.html',context))  

これは私の homefeed.html テンプレートのセクションです。「無限スクロール」手法を使用してより多くの結果を取得しています

<script>
{% if cursor %}
$(window).scroll(function()
{
var src=$("#src_val").val();
if($(window).scrollTop() == $(document).height() - $(window).height())
{
    $('div#loadmoreajaxloader').show();
    $.ajax({
    url:"/home",
    type:'GET',
    data: {cursor: '{{cursor}}',feed_id:src },
    success: function(news)
    {
        if(news)
        {
            $("#wrapper").append(news);
              $('div#loadmoreajaxloader').hide();

        }else
        {
        $('div#loadmoreajaxloader').html('No more posts to show.');
        }
    }
    });
}
});
{% endif %}
</script>
4

1 に答える 1

1

get()ページの表示と AJAX リクエストの処理の両方にメソッドを使用しているようです。最初のカーソルでページを正しく生成していますが、$.ajax()メソッドは JSON データを返すことを期待しています。

ページ リクエストと AJAX リクエストを 2 つのメソッドに分割します。post()次のような JSON データを返すメソッドを HomeHandler に追加してみてください。

import json

def post(self):
    q = Allnews.query().order(-Allnews.date_added)
    cursor = ndb.Cursor(urlsafe=self.request.get('cursor',default_value=None))
    items, next_curs, more = q.fetch_page(30, start_cursor=cursor)
    if more:
        next_c = next_curs.urlsafe()
    else:
        next_c = None
    self.response.headers['Content-Type'] = 'application/json'   
    self.response.out.write(json.dumps({'news': items, 'cursor': next_c))

これで、JSON データを AJAX リクエストに返すメソッドができました。

<script>
var cursor = null;
$(window).scroll(function()
{
if($(window).scrollTop() == $(document).height() - $(window).height())
{
    $.ajax({
    url:"/home",
    type:'POST',
    data: {cursor: cursor},
    success: function(data)
    {
        $("#wrapper").append(data['news']);
        cursor = data['cursor'];
        if ( !cursor )
            $('div#loadmoreajaxloader').show().html('No more posts to show.');
    }
    });
}
});
</script>

各 AJAX 要求でカーソル値がどのように更新されるかに注目してください。これは、次のリクエストで新しいカーソルを取得する方法です。

(このコードはテストされていないため、デバッグが必要になる場合があります。)

于 2013-07-30T00:35:32.583 に答える