Meteor:如何检测用户是否经过身份验证

时间:2014-06-08 09:03:36

标签: javascript meteor

在我的应用中,我使用accounts-github。效果很好,但我有一个问题。

在我的一个模板中

Template.bar.rendered = function () {
    if (Meteor.user()) {
        // setup stuff
    }
}

问题是,如果用户最初未登录,则此代码未执行(没关系)。但是当用户验证时,此代码不会再次执行。所以问题是如何在模板中监听这个变化(不必在rendered函数内部?)?

2 个答案:

答案 0 :(得分:2)

您可以使用Deps.autorun。 (http://docs.meteor.com/#deps_autorun

通常会为您的整个Meteor应用运行Deps.autorun。如果你想让它只运行每个模板,你需要在渲染和销毁的模板回调中创建和停止它

e.g

var loginRun;

Template.bar.rendered = function() {
    loginRun = Deps.autorun(function() {
        if(Meteor.user()) {
            //Stuff to run when logged in
        }
    });
}

Template.bar.destroyed = function() {
    loginRun.stop();
}

如果您不需要它来运行每个模板(需要它在任何模板上为您的应用运行一次,那么您可以在客户端代码的任何位置单独使用Deps.autorun

Meteor.user()是被动的,它会确保Deps.autorun回调在更改时再次运行,因此理论上可以在用户登录或注销时使用它来执行操作。

其他替代方案是在大气层上有一个提供登录和注销钩子的包,尽管它们基本上会像上面那样使用Deps.autorun来工作。见https://github.com/BenjaminRH/meteor-event-hooks

答案 1 :(得分:1)

我对类似问题的解决方案是

  1. 将事件附加到登录发生的模板
  2. 如果登录成功,则重新呈现模板,以便调用Template.bar.rendered
  3. E.g。

    Template.bar.events({ 
       'click .loginButton' : function() {
        if( Meteor.call.Login( username, pw ) )
        {
            $('#bar').html( Meteor.render( Template.bar ));
            //jQuery is optional
        }
    });