5

如果我更改Sessionvar 并通过触发重新订阅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] 显然,服务器上的数据在不断变化,但正如您将在要点中看到的那样,我无法(没有超时)找到它甚至正确的点。因此,我在问题中使用了“有效”。

一个非常简单和常见的用例

使用 makewith 应用程序;当您第一次加载它时,似乎没有注册任何应用程序,直到数据通过网络传输并且应用程序突然出现。

这样做的原因是Meteor.subscribe已调用,但数据尚未传出。但是模板没有简单的方法来告诉数据是待处理的并且它应该显示一个“加载”模板。在madewith中,它们实际上在数据加载时会做一些事情,但这是一个回调,因此打破了正常的meteor做事方式(即反应式编码)。

能够编写如下内容会更好(IMO):

 {{unless apps_loaded}}{{> loading}}{{/unless}}

 Template.madewith.apps_loaded = function() { return !Apps.isComplete(); }
4

2 回答 2

3

有趣的问题。

通知新订阅的正确位置是onReady回调。请注意那里发生的日志记录总是包含您的新数据。检查 (a) 和 (b) 没有用,因为在调用subscribe和所有数据从服务器到达之间存在延迟。

潜在的问题是,一旦刚刚停止的订阅的数据被删除,就没有等效的onRemove回调运行。此外,autosubscribe在停止旧的潜艇之前故意启动新的潜艇,以避免闪烁。

真正的用例是什么?大多数时候这样的回调是不必要的,因为模板也可以将它们的查询限制在应该在范围内的数据上。在您的示例中,呈现评论的模板助手可能只查询当前post_id会话中的评论,因此在数据库中添加额外的评论并没有什么坏处。像这样的东西:

Template.post.comments = function () {
  return Comments.find({post_id: Session.get('post_id')});
};

这允许策略比通用autosubscribe功能更复杂,例如订阅用户查看的最后三个帖子的评论。或者,订阅每个帖子的前几条评论,然后仅在选择该帖子时单独订阅帖子的完整评论集。

于 2012-05-30T04:44:41.333 回答
0

我参加流星派对有点晚了,所以我不知道添加流星功能的历史,但为了完整起见,现在可以使用模板级订阅和 'subscriptionsReady' 来做到这一点:

[js]
Template.myTemplate.onCreated(function() {
  this.subscribe('myData');
});

[html]
<template name="myTemplate">
  <h2>my Template</h2>
  {{#if Template.subscriptionsReady}}
    // code to loop/display myData
  {{else}}
    <p>Please wait..</p>
  {{/if}}
</template>
于 2015-07-18T10:31:41.953 回答