如果我改变一个Session
var 并通过以下方式触发重新订阅autosubscribe
,是否有任何回调机制可以等待“最新”数据从服务器上下来? [1]
如果你看一下这个要点您将看到一些代码,这些代码随着订阅的变化而记录集合的内容。输出的相关部分:
at Subscribed; comments are: first post on #1 - second post on #1
at Flushed; comments are: first post on #1 - second post on #1
at Subscription complete; comments are: first post on #1 - second post on #1 - first post on #2 - second post on #2
所以,即使在 (a) 调用之后.subscribe
, (b) 调用Meteor.flush
(c) 位于onReady
回调.subscribe
;集合中仍然存在过时的数据,并且只有在第三种情况下才是“正确”的数据。
我意识到反应式模板和.observe
最终将收到正确的数据,并且事情将“稳定”到正确的状态。但有什么方法可以让我们知道我们还没有到达那一步吗?
例如,大多数流星示例应用程序(以及我自己的应用程序)在从订阅的集合中添加和删除数据时容易出现一些抖动(类似于 FOUC)。如果我们知道订阅正在“加载”,我们就可以采取一些措施。
[1] 显然,服务器上的数据在不断变化,但正如您在要点中看到的那样,我无法(没有超时)找到它甚至是正确的点。因此我在问题中使用了“有效”。
一个非常简单且常见的用例
使用madewith应用程序;当您第一次加载它时,似乎没有注册任何应用程序,直到数据传输完毕并且应用程序突然出现。
这样做的原因是Meteor.subscribe
已被调用,但数据尚未传出。但是模板没有简单的方法来告诉数据正在等待并且它应该显示“正在加载”模板。在madewith他们实际上在数据加载时做了一些事情,但这是一个回调,因此打破了正常的流星做事方式(即反应式编码)。
如果能够写出如下内容会更好(IMO):
{{unless apps_loaded}}{{> loading}}{{/unless}}
and
Template.madewith.apps_loaded = function() { return !Apps.isComplete(); }