代码之家  ›  专栏  ›  技术社区  ›  Abe Miessler

新记录是否显示在表的底部?

  •  1
  • Abe Miessler  · 技术社区  · 8 年前

    我有一个meteor应用程序,它使用以下代码在表中显示记录:

    Template.records.helpers({
      trackingData: function() {
        return Tracking.find({},{$sort: {fullDate: -1}})
      }
    })
    

    和

    <table>
      ...
      {{#each trackingData}}
         <tr class="record" id="{{_id._str}}">
         ...
      {{/each}}
      ...
    </table>
    

    和

    Meteor.publish('tracking', function(filter, offset) {
        var records = Tracking.find(filter,{
          sort: {fullDate: -1}, 
          limit:10, 
          skip: offset*10
        });
        return records
      });
    

    出于某种原因,添加新记录时,它总是显示在表的底部。根据我的排序,新记录应该显示在顶部。奇怪的是,当我刷新页面时,记录保持在底部 但是 当我停止应用程序并重新启动它时,记录会显示在顶部。我遗漏了什么会导致这种奇怪的排序行为?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Community Mohan Dere    6 年前

    您可能想使用 Tracker.flush() 或类似:

    通常,当您进行更改(如写入数据库)时,其影响(如更新DOM)会延迟到系统空闲时。这使事情保持可预测性–您可以知道DOM不会在运行时从您的代码下发生变化。这也是流星变快的原因之一。

    Tracker.flush 强制完成所有挂起的反应式更新。例如,如果事件处理程序更改了会话变量,这将导致部分用户界面重新呈现,则处理程序可以调用flush立即执行重新呈现,然后访问生成的DOM

    基本上 Collection.find 操作返回通常只计算一次的游标。

    该主题由 this blog 也:

    将文档发布到客户端时,它们将与其他文档合并 来自同一集合并重新排列到内存中的文档 名为minimongo的数据存储。正在重新排列的关键字。

    许多meteor新开发人员都有一个发布数据的心智模型 存在于有序列表中。这就引出了这样的问题:“我 按排序顺序发布了我的数据,为什么不这样显示 在客户端上?“这是意料之中的。有一条简单的规则可以遵循:

    如果您需要在客户机上订购文档,请在 客户。通常不需要在发布函数中进行排序 除非排序结果更改发送的文档(例如。 您正在使用限制)。

    但是,您可能希望在以下情况下保留服务器端排序 数据传输时间很长。想象一下发布几个 一百篇博客文章,但最初只显示最近的十篇。在里面 这种情况下,最新的文档首先到达客户机 将有助于最小化模板渲染的数量。