【问题标题】:Meteor.js : performance issue when using paginated-subscription with larger datasetMeteor.js:使用带有较大数据集的分页订阅时的性能问题
【发布时间】:2013-09-23 07:14:51
【问题描述】:

我正在构建一个应用程序,它应该能够列出数千篇带有分页/无限滚动的文章。用户应该能够过滤/排序这个列表,目前我在排序文章时遇到了性能问题。

我设置了一个非常基本的应用程序来演示这个问题:http://meteor-paginated-subscription-example.meteor.com/(参见 Github:https://github.com/lacco/meteor-paginated-subscription-example)。如果您打开 Firefox/Chrome 控制台并单击“创建于”/“优先级”以启动排序,您会看到 Template.articles.rendered 一键调用了数百次。您还看到表格需要一些时间才能“最终”完成,在加载和渲染期间,行的顺序经常发生变化。

我确信我在代码中做了一些废话,但我无法弄清楚我的问题出在哪里。你能帮帮我吗?

【问题讨论】:

    标签: pagination meteor


    【解决方案1】:

    collection.cursor Models.Articles.find({}, ...) 是一个反应式数据源。对该光标中项目的任何更改都会导致模板articles_table 和`{{#each article}} 中的子模板重新呈现。

    您的方法导致您更改数据订阅,因此客户端调用服务器请求新数据。您看到的闪烁是由于新数据到达和旧数据被删除时显示的中间步骤引起的。在从帮助程序Template.articles_table.articles 返回任何内容之前尝试检查if handle.ready(),以便仅在数据集完成时显示该表。

    更新:响应 cmets 中的附加功能请求。如果您存储“previousSort”并且在排序或限制更改时还存储“previousLimit”,您可以在客户端等待订阅准备就绪时显示您的旧查询并关闭响应性:

    if ( handle.ready() ){
      return Models.Articles.find({}, {sort: sort, limit: limit});
    }    
    else {
      return Models.Articles.find({}, {sort: previousSort, limit: previousLimit, reactive: false});
    }
    

    【讨论】:

    • 非常感谢,但是我该如何处理加载更多按钮呢?如果Template.articles_table.articles 在加载时没有返回任何内容,那么在点击“加载更多”时页面将被清空。而且我认为这对用户来说是不可接受的......
    • 我会提出一个单独的问题。除了仅更改您拥有的数据的排序顺序(可能不是您想要的)之外,您还需要一些逻辑来仅在加载后以新顺序显示新数据。检查订阅句柄是否准备好是处理此问题的最基本方法。当您添加附加功能时,代码和 if 逻辑将需要变得更加复杂,但您仍需要在排序和显示给客户端之前检查您是否拥有所有数据。
    • 您能否提供一个简单的想法,让分页和过滤同时工作?你是对的,我的问题没有明确涵盖这一点,但由于我的示例应用程序已经处理了这两种情况,我认为在这里回答它是有效的。
    • 我更新了我的答案。我不确定在这种情况下“工作”是什么意思。您的问题似乎更多是关于在页面加载或无限滚动期间显示什么。
    • 我刚刚尝试了您的建议(除了返回非反应性集合的部分):github.com/lacco/meteor-paginated-subscription-example/commit/…,但我仍然遇到闪烁 :(。我还更新了 meteor-paginated-subscription-example.meteor.com。我在做什么有什么问题吗?
    猜你喜欢
    • 2023-04-03
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多