我有一个流星应用程序,它使用以下代码在表中显示记录:
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
});
出于某种原因,当我添加新记录时,它总是显示在表的底部。根据我的排序,新记录应该显示在顶部。奇怪的是,当我刷新页面时,记录保留在底部,但是当我停止我的应用程序并重新启动它时 - 记录会像它应该的那样显示在顶部。我可能会遗漏什么会导致这种奇怪的排序行为?
您可能想要使用Tracker.flush()
或类似的:
通常,当您进行更改(例如写入数据库)时,它们的影响(例如更新 DOM)会延迟到系统空闲时。这使事情保持可预测性——您可以知道 DOM 在运行时不会从您的代码下发生变化。这也是使 Meteor 运行速度快的原因之一。
Tracker.flush
强制所有挂起的反应更新完成。例如,如果一个事件处理程序更改了一个 Session 变量,这将导致部分用户界面重新呈现,则处理程序可以调用 flush 立即执行重新呈现,然后访问生成的 DOM
基本上,该Collection.find
操作返回一个通常只计算一次的游标。
该博客也涵盖了该主题:
当您将文档发布到客户端时,它们会与来自同一集合的其他文档合并,并重新排列到名为 minimongo 的内存数据存储中。正在重新排列的关键字。
许多新的流星开发人员都有一个已发布数据的心智模型,它们存在于有序列表中。这会导致如下问题:“我按排序顺序发布了我的数据,那么为什么它在客户端上没有显示出来呢?” 这是预期的。有一个简单的规则要遵循:
如果您需要在客户端订购文档,请在客户端对它们进行排序。通常不需要在发布功能中进行排序,除非排序结果更改了发送的文档(例如,您正在使用限制)。
但是,在数据传输时间很长的情况下,您可能希望保留服务器端排序。想象一下发布了数百篇博文,但最初只显示了最近的 10 篇。在这种情况下,让最新的文档首先到达客户端将有助于最大限度地减少模板渲染的数量。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句