作为一项练习,我正在编写简单的(也是尽可能无状态的)客户端应用程序(在React中),在单个Facebook实体的Feed中显示帖子。该应用程序从Facebook Graph API获取其数据。
我使用Facebook JS SDK查询以下网址:/<entity-id>/feed?limit=20&fields=...
我有简单的分页按钮(“上一个”和“下一个”),它们分别在response.paging.previous
和response.paging.next
中查询API响应中收到的分页网址。
问题是我不知道如何查明我是否在最后一页以正确禁用“下一步”按钮。
我尝试了几件事,但是我仍然没有得到我想要的东西。
选项1:允许点击“下一步”,直到没有更多数据作为回复
按钮在response.data.length == 0
时被禁用。
paging
对象包含next
网址,即使没有更多数据要接收,所以在进入没有数据的网页之前我无法检查它。
问题是,当我到达该页面时,paging
中也没有response
个对象。因此,我无法使用“上一页”按钮返回带有数据的最后一页。
选项2:允许点击“下一步”,直到我收到的数据少于查询限制
按钮在response.data.length < limit
时被禁用。
适用于data.length % limit != 0
。
问题是相反的情况,例如当集合中有40个对象并且我在第二页上有限制20时,我仍然可以单击“下一步”,但后来我最终在页面上没有更多的对象,如选项1中所述。
选项3:记住上次请求的网址
上次请求网址存储在变量中,即使paging
中没有response
数据,“上一页”按钮也会有效。
只解决“你不能回头”的问题。
通过正确禁用“下一步”按钮无法解决问题。仍然可以在包含数据的最后一页上单击“下一步”,然后转到没有数据的空白页面。
所以问题是:
如何才能发现我已经收到了收藏中的最后一项,点击“下一步”我会收到无效的空白页?
即使在集合的开头/结尾,Graph API也提供response.paging
网址,这似乎很奇怪。
例如,如果我有10个帖子的Feed并且我使用limit 20
进行查询,则会收到response
data: Array[10]
和paging
个对象,其中包含有效的网址paging.previous
和paging.next
,即使没有“上一个”也没有“下一个”数据。
查询这些网址导致response
空data
数组且没有paging
对象,因此我无法返回无状态应用程序。
如果集合开头没有paging.previous
而集合结束时没有paging.next
会不会更好?
答案 0 :(得分:1)
通过Graph API基于游标的分页。 https://developers.facebook.com/docs/graph-api/using-graph-api#cursors
没有匹配的方法可以随心所欲地开箱即用。 您应该分别管理左侧记录和下一个按钮,分别是Graph API分页。 作为解决方案预加载下一页除了当前。
同样保存上一个光标是不好的做法: “不要存储游标。如果添加或删除项目,游标很快就会变得无效。”
答案 1 :(得分:1)
对于任何人看到这一点 - 这实际上是可行的。我不确定Graph分页对象以前是否总是返回上一个和下一个,或者OP是否在任何地方出错。但是,我可以确认,当数据能够像您预期的那样前进或后退时,它将正确返回上一个/下一个。
以下示例来自Graph API分页文档,并显示了该集合的第一页结果集。
"data": [
*data returned*
],
"paging": {
"cursors": {
"before": "WTI5dGJXVnVkRjlqZAFhKemIzSTZANVGd3T1Rrek9UZAzROVGN3TlRNNE5Eb3hOVEV6TURnM09UTTIZD",
"after": "WTI5dGJXVnVkRjlqZAFhKemIzSTZANVGd4TURBd09UazROVFk1T0RNM05Eb3hOVEV6TURreU5qQXoZD"
},
"next": "https://graph.intern.facebook.com/v2.11/1809938745705498/comments?access_token=valid_token_goes_here"
}
请注意,之前没有&#39;对象中的属性。仅检查下一个或上一个是否存在就足以让我继续禁用/隐藏按钮。