【发布时间】:2016-02-11 10:37:57
【问题描述】:
我正在使用 Iron 路由器的 onBeforeAction 方法来检查用户是否登录了除注册和登录路由之外的所有路由:
Router.onBeforeAction(function() {
if (!Meteor.user()) {
this.render('login');
}
else {
this.next();
}
}, {except: ['login', 'register']});
(仅供参考,登录过程是在登录模板/js 中使用this code 进行的)
这很好用,只是当我登录时,登录模板会在被实际模板替换之前快速显示。
当我检查发生了什么时,我发现Meteor.user() 在 Iron 路由器之前还没有准备好。结果,登录页面显示为用户未登录。然后(因为Meteor.user() 是响应式的),当Meteor.user() 准备好时,路由将再次运行,显示正确的模板。
我怎样才能使上面的这个小代码示例正常工作?(意思是:没有显示登录模板,因为Meteor.user() 还没有准备好)
我还在 Stack Overflow 上发现我可以使用 fast-render package,但我不愿意破解渲染过程。 onRun() 方法也不能解决这个问题。
我还在某处读到过我可以使用Router.configure 的waitOn 选项的文章,但我唯一的例子是我还没有订阅(我正在使用不安全的自动发布包进行原型设计)。
【问题讨论】:
-
这不会有太大帮助,但我在使用 IR 时遇到了同样的问题,并且听说流路由器不会随机重新渲染。基本上,我已经同意切换到 Flow Router。
-
@Ruby_Pry 嗯,这是一个激进的方法!但我确信仍有希望。尤其是
waitOn附近的某个地方。请有人,向我们展示你的光芒! :) -
顺便说一句,我什至尝试过使用官方文档的
this.isReady()方式,但它不起作用(看起来它正在等待订阅)。 @Ruby_Pry:不过我找到了一种方法。我现在把它贴在这里。 -
并不激烈,因为它是未来流星社区使用的主要路由器。此外,它还有 Iron Router 目前缺乏的持续支持。
-
@Ruby_Pry 谢谢,我不知道。我会尝试下一个项目:)
标签: javascript meteor login iron-router