Iron-router和Meteor.user:路由被叫两次

时间:2015-11-10 14:08:02

标签: javascript meteor login iron-router

我使用Iron路由器的const int a = 12; const int b = 24; cout << max(a, b) << endl; 方法检查用户是否登录了除注册和登录路由之外的所有路由:

onBeforeAction

(仅供参考,登录过程在登录模板/ js中this code进行)

这很有效,除了当我登录时,登录模板会在被实际模板替换之前快速显示。

当我检查发生了什么时,我发现在铁路由器之前Router.onBeforeAction(function() { if (!Meteor.user()) { this.render('login'); } else { this.next(); } }, {except: ['login', 'register']}); 尚未就绪。因此,登录页面显示为用户未被记录。然后(因为Meteor.user()是被动的),当Meteor.user()准备就绪时,路线将再次运行,显示正确的模板。

如何使上面的代码示例正常工作?(含义:由于Meteor.user()未显示登录模板尚未准备好)

我在Stack Overflow上也发现我可以使用fast-render package,但我不愿意破解渲染过程。 Meteor.user()方法也没有解决此问题。 我也在某个地方读过我可以使用onRun() Router.configure选项但我唯一的例子就是我还没有订阅(我使用不安全的自动发布包进行原型设计)。

1 个答案:

答案 0 :(得分:0)

我不认为这是最好的解决方案,但这个技巧很好用:

Router.onBeforeAction(function() {
   if (Meteor.user() !== undefined) {
        if (!Meteor.user()) {
            this.render('login');
        }
        else {
            this.next();
        }
    }
    else {
        this.pause();
    }
}, {except: ['login', 'register']});

此代码示例有效,因为Meteor.user()在准备就绪之前未定义,如果它已准备好但没有用户登录,则 null

对于我的项目,我甚至在加载屏幕上替换了this.pause()

Router.onBeforeAction(function() {
   if (Meteor.user() !== undefined) {
        if (!Meteor.user()) {
            this.render('login');
        }
        else {
            this.next();
        }
    }
    else {
        this.render('loading');
    }
}, {except: ['login', 'register']});

我希望这会对别人有所帮助。