我设置了一个 /user
路由,如果当前用户未登录,它应该呈现 login
模板。整个路由器有一个 waitOn
等待 currentUser
订阅完成。问题是,当我转到 /user
时,它只是呈现 dataNotFound
模板。
以下是与这种情况相关的代码片段。我一直小心翼翼地按照它们在我的 lib/router.js
文件中定义的顺序向您展示它们。
Router.plugin('dataNotFound', {notFoundTemplate: 'notFound'});
Router.onBeforeAction(function () {
console.log(Meteor.userId())
if (!Meteor.userId()) this.render('login');
else this.next();
}, { only: ['user'] });
Router.configure({
waitOn: function () { return Meteor.subscribe('currentUser'); }
});
Router.route('/user', {
name: 'user',
template: 'userView',
data: function () { return Meteor.user(); }
});
上面的 console.log
甚至从未触发过。在我看来,由于它应该是一个 react 函数,即使最初呈现 dataNotFound
,那么不久之后 onBeforeAction
应该被触发并呈现 登录
模板,对吧?
最佳答案
很奇怪的是你的控制台日志甚至没有触发。我有一些想法,但首先想解决你的最后一个问题。
当数据函数在路由上触发时,将触发 dataNotFound 插件。这意味着它完全绕过了你的 onBeforeAction 钩子(Hook),而不是说它没有到达那里。
我能想到的一件值得尝试的事情是将“用户”路由操作包装在 if ( this.ready() )
语句中:
编辑:
Router.route('用户', {
//你的其他东西
Action :函数(){
如果这个.ready() {
this.render();
},
我建议这只是因为您正在使用 waitOn 语句,但如果您的 route 某处没有 this.ready() ,我不能 100% 确定它是如何工作的,因为这就是 (再次,根据我对文档的阅读,没有摆弄它)告诉路由器在执行之前要等待什么。可能现在根本就没有等待。
关于meteor - Iron Router onBeforeAction 未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26833529/