我有一个视图,它有一个for循环,可以将行插入表中。该表非常大,已经包含了几千行。
当我运行它时,服务器会抛出内存异常。
我想添加无限滚动功能,因此我不必一次加载所有数据。
目前正在使用常规res.render(index.ejs, data)
发送数据(data
是JSON)
我可以找出无限滚动部分,但是如何从服务器获取块中的JSON数据?
我使用带有express和ejs的node.js作为模板引擎。 我愿意使用任何可以帮助我完成整个过程的框架(尤其是检查Angualr.js)。
由于
答案 0 :(得分:2)
首先,有一个无限滚动的角度分量:http://ngmodules.org/modules/ngInfiniteScroll
然后,您必须将后端查询更改为:
http://my.domain.com/items?before=1392382383&count=50
这实质上告诉您的服务器在给定时间戳之前获取创建/发布/更改/ 任何的项目,并仅返回其中的50个。这意味着您的后端实体(无论是博客条目,产品等)需要在连续空间中具有一些自然排序(发布日期时间戳几乎是连续的)。这是非常重要的,因为即使您使用时间戳,也可能最终使用极端的heisenbugs,其中项目呈现两次(如果您使用< =那个定义),松散条目(如果您使用<和2个条目结果集的边缘在同一时间戳上)或者甚至一次又一次地加载相同的项目(在同一时间戳上超过50个项目)。您必须通过过滤重复项来处理此类情况。
您的服务器端代码将其转换为类似(DB2 SQL当然)的查询:
SELECT * FROM ITEMS
WHERE PUBLICATION_DATE <= 1392382383
ORDER BY PUBLICATION_DATE DESC
FETCH FIRST 50 ROWS ONLY
当无限滚动到达页面末尾并调用已注册的回调时,您可以通过考虑已加载项目的最后一项来创建此$http.get
请求。对于第一个查询,您可以使用当前时间戳。
另一种方法是简单地发送最后一项的id,如:
http://my.domain.com/items?after_item=1232&count=50
让服务器决定做什么。我想你可以使用像Redis这样的NoSQL存储来快速回答这种查询并且没有副作用。
这是一般的想法。我希望它有所帮助。