【发布时间】:2012-05-29 07:06:53
【问题描述】:
如果我更改Session var 并通过autosubscribe 触发重新订阅,是否有任何回调机制等到“最新”数据从服务器关闭? [1]
如果您查看this gist,您会看到一些代码随着订阅的变化记录集合的内容。输出的相关部分:
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;集合中仍然存在陈旧数据,只有在第 3 种情况下才是“正确”数据。
我意识到响应式模板和.observe 最终会收到正确的数据,并且事情会“稳定”到正确的状态。但是有什么方法可以告诉我们我们还没有到达那里吗?
例如,大多数流星示例应用程序(以及我自己的应用程序)在从订阅的集合中添加和删除数据时都容易出现抖动(类似于 FOUC)。如果我们可以判断订阅正在“加载”,我们可以对此采取一些措施。
[1] 显然,服务器上的数据在不断变化,但正如您将在要点中看到的那样,我无法(没有超时)找到它甚至是正确的点。因此我在问题中使用了“有效”。
一个非常简单且常见的用例
采取制造的应用程序;当您第一次加载它时,似乎没有注册任何应用程序,直到数据通过网络传输并且应用程序突然出现。
原因是Meteor.subscribe 已被调用,但数据尚未传出。但是模板没有简单的方法来告诉数据是待处理的并且它应该显示一个“加载”模板。在madewith 中,它们实际上是在数据加载后做一些事情,但这是一个回调,因此打破了正常的流星做事方式(即反应式编码)。
如果能写出类似这样的东西会更好(IMO):
{{unless apps_loaded}}{{> loading}}{{/unless}}
和
Template.madewith.apps_loaded = function() { return !Apps.isComplete(); }
【问题讨论】: