流星:等待客户端的收集

时间:2016-03-10 18:01:44

标签: javascript sorting templates meteor callback

最后编辑:在订阅准备好的回调中尝试Tracker.afterFlush

编辑:排序不是问题,它是使用新会话变量对同一集合的新订阅。出现问题是因为Meteor在触发subscribe-onReady回调之前没有踢旧文档...

我有一个Meteor助手,它返回一个已排序的集合(映射文档)。 它看起来像这样:

"currentNames": function () {
       if (Session.get("sortBy") === "rating") {
            return MyCollection.find({'name': {$exists: true}}, {sort: {rating: -1}}).map(function (document, index) {
                document.index = index;
                return document;
            });
       }
       else if (Session.get("sortBy") === "alphabet") {
            return MyCollection.find({'name': {$exists: true}}, {sort: {name: 1}}).map(function (document, index) {
                document.index = index;
                return document;
            });
        }
}

排序很美。我有一个模板在{{#each currentNames}} - 循环中使用这个助手也可以。但是当我通过更改会话字段sortBy更改排序类型时,我显示的结果(html-dom-elems)完全旋转(改变他们的位置),直到找到他们的最终排序。我正在谈论我收集的100个文件。

因为我不希望我的用户直接看到这个排序过程,所以我想等到排序结束。但我无法想出一种等待排序结束的方法。我知道何时隐藏结果(这是会话变量sortBy被更改的时候),但是在排序结束时我没有回调或其他东西。但我需要这个。

感谢您的时间!希望你能帮帮我。

1 个答案:

答案 0 :(得分:0)

来自流星指南:

  

当新订阅开始并且旧订阅停止时,了解服务器上发生的情况也值得了解。

     

在从旧订阅中删除数据之前,服务器显式等待,直到新订阅的所有数据都被发送(新订阅已准备好)。这里的想法是避免闪烁 - 如果需要,您可以继续显示旧订阅的数据,直到新数据准备就绪,然后立即切换到新订阅的完整数据集。

     

这意味着一般来说,在更改订阅时,会有一段时间过度订阅,并且客户端上的数据比您严格要求的要多。这是一个非常重要的原因,你应该总是获取你订阅的相同数据(不要“过度获取”)。

因此,在您的情况下,您可以隐藏您的视图(或显示加载文本等),直到您的新订阅准备就绪。您可以使用订阅处理程序ready()函数(它是被动的)来检查它。