在模板呈现之前等待 Meteor.user() 完全加载

Wait for Meteor.user() to completely load before template renders

之前有人问过这个问题,但我觉得我没有看到合适的答案。我目前在布局模板上使用 {{ #if currentUser.emails.[0].verified }} show data {{else}} please verify email {{/if}} 检查用户是否已验证他们的电子邮件。在这种情况下,如果用户已注册,我会在屏幕之间闪烁,因为 meteor.user() 尚未完全加载,因此 currentUser.emails.[0].verified returns null 并在完全加载后更改为 true .

有没有一种方法可以在不使用延迟的情况下等待 Meteor.userId 在模板呈现之前完全加载?

通常,您可以在模板中使用 Template.subscriptionsReady 来包装依赖于订阅数据的代码。由于 Meteor 自动处理 currentUser 的 publish/subscribe,我不确定这个方法是否有效。试试看,让我知道。

示例。

{{#if Template.subscriptionsReady}}
  {{ #if currentUser.emails.[0].verified }} show data {{else}} please verify email {{/if}}
{{/if}}

内嵌的 meteor "currentUser" 帮助程序可以让您知道用户集合何时准备就绪:

{{#if currentUser}} // 做我的事 {{别的}} 正在检查... // 您还可以在此处显示微调图片或 GIF<br> {{/if}}

我发现对我来说效果很好的是在 iron router 的 waitOn 函数中订阅等待中的用户:

Router.route('/',{
        waitOn: [
            function() { 
                if (!Meteor.userId()) {
                  Router.go("/login");
                }
                return Meteor.subscribe('currUser');
            },

        ],
        ...
})