我正在构建一个应该能够通过分页/无限滚动列出数千篇文章的应用程序。用户应该能够对此列表进行过滤/排序,目前我在排序文章时遇到性能问题。
我设置了一个非常基本的应用程序来演示问题:http://meteor-paginated-subscription-example.meteor.com/(参见Github:https://github.com/lacco/meteor-paginated-subscription-example)。如果您打开Firefox / Chrome控制台并单击“创建于”/“优先级”以启动排序,您会看到Template.articles.rendered
一次点击几百次。您还会看到该表需要一些时间才能成为“最终”,在加载和呈现行的顺序时会经常更改。
我确信我在代码中做了一些废话,但我无法弄清楚问题的原因在哪里。你能救我一下吗?
答案 0 :(得分:0)
collection.cursor,Models.Articles.find({}, ...)
是一个被动数据源。对该游标中项目的任何更改都将导致模板articles_table
和`{{#each articles}}内的子模板重新呈现。
您的度假村会导致更改您的数据订阅,以便客户端调用要求新数据的服务器。您看到的闪烁是由于在新数据到达并删除旧数据时显示使用的中间步骤而引起的。在从帮助器if handle.ready()
返回任何内容之前,请尝试检查Template.articles_table.articles
,以便仅在数据集完成时显示该表。
更新:响应评论中的其他功能请求。如果存储“previousSort”并且还存储“previousLimit”,只要排序或限制发生更改,您就可以在客户端等待订阅准备就绪时关闭反应性来显示旧查询:
if ( handle.ready() ){
return Models.Articles.find({}, {sort: sort, limit: limit});
}
else {
return Models.Articles.find({}, {sort: previousSort, limit: previousLimit, reactive: false});
}