我有一个使用以下代码在表格中显示记录的流星应用程序:
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
});
出于某种原因,当我的新记录被添加时,它总是显示在表格的底部。根据我的排序,新记录应显示在最顶层。奇怪的是,当我刷新页面时,记录保持在底部但当我停止我的应用程序并重新启动它时 - 记录显示在顶部,就像它应该的那样。我可能会遗漏哪些会导致这种奇怪的排序行为?
答案 0 :(得分:1)
您可能希望使用Tracker.flush()
或类似内容:
通常,当您进行更改(如写入数据库)时,它们的影响(如更新DOM)会延迟,直到系统处于空闲状态。这样可以保持可预测的状态 - 您可以知道DOM在运行时不会从代码中更改。这也是使Meteor快速发展的原因之一。
Tracker.flush
强制完成所有待处理的响应式更新。例如,如果事件处理程序更改会导致部分用户界面重新呈现的Session变量,则处理程序可以调用flush以立即执行重新呈现,然后访问生成的DOM
基本上,Collection.find
操作返回一般只计算一次的游标。
该主题也由this blog涵盖:
将文档发布到客户端时,它们将与其他文档合并 来自同一集合的文档并重新排列为内存中的文档 数据存储称为minimongo。关键词是重新安排的。
许多新的流星开发者都拥有已公布数据的心智模型 存在于有序列表中。这导致了类似的问题:“我 以排序的顺序发布我的数据,为什么不以这种方式出现 在客户端?“这是预期的。有一个简单的规则要遵循:
如果您需要在客户端上订购文档,请对其进行排序 客户端。通常不需要在发布函数中进行排序 除非排序结果改变了哪些文件被发送(例如 你正在使用限制。)
但是,您可能希望保留服务器端排序 数据传输时间很长。想象一下发布几个 一百个博客帖子,但最初只显示最近的十个。在 在这种情况下,让最新的文档首先到达客户端 将有助于最小化模板渲染的数量。