2016-03-10 37 views
2

最后编辑:尝试Tracker.afterFlush在订阅就绪回调。流星:等待客户端排序收集

编辑:排序不是问题,它是与新的会话变量相同的集合的新订阅。由于Meteor在触发subscribe-onReady回调之前未触发旧文档,因此发生问题...

我有一个流星帮助器,它返回一个排序后的集合(映射文档)。 它看起来像这样:

"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}} -loop也可以。但是,当我通过更改会话字段sortBy更改排序类型时,我显示的结果(html-dom-elems)完全旋转(改变它们的位置),直到它们找到最终排序。我正在谈论我正在排序的集合中的100个文档。

因为我不想让我的用户看到这个排序过程,我想等到排序完成。但我无法想出一种方法来等待排序完成。我知道何时隐藏结果(这是在会话变量sortBy发生变化时),但是当排序完成时,我没有回调或其他东西。但我需要这个。

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

回答

0

从流星指南:

这也是值得了解一些关于当新的订阅开始,旧的被停止在服务器上发生了什么。

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

这是什么意思,一般来说,当改变订阅时,会有一段时间你的订阅量过高,客户端上的数据比你严格要求的要多。这是为什么您应该始终获取您订阅的相同数据(不要“过度获取”)的一个非常重要的原因。

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

+0

我不认为这真的回答了我的问题,因为订阅就绪回调是在排序之前触发的。 – ant45de