0

我从我的 appengine 日志中意识到,每次都会生成相同的光标,调用 Homehandler。请知道我做错了什么,下面是我的代码片段:

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 请求拆分为两种方法。尝试向post()HomeHandler 添加一个返回 JSON 数据的方法,如下所示:

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