目标我希望根据在订阅电话后检索的文档,从我的流路由器功能中呈现模板A或模板B中的一个。
更具体地说,我想基于用户文档的 isAdmin 字段呈现管理员或学生模板,在完成订阅调用后检索。 我的路由器功能如下所示。
FlowRouter.route('/songs/list', {
name: 'Songs.list',
subscriptions: function(params, queryParams) {
this.register('getUser', Meteor.subscribe('allUsers', Meteor.userId()));
}
action(params, queryParams) {
if(Meteor.user().isAdmin){
BlazeLayout.render("admin_home");
}
else{
BlazeLayout.render("student_home");
}
}
});
Flow路由器文档特别提到
FlowRouter仅处理订阅注册。它不会等到订阅准备就绪。
因此,可能存在这样的情况:
使用iron-router,可以使用waitOn轻松处理。但是对于流路由器,我被迫有两个独立的功能,进一步强制执行2个单独的URL,用于呈现管理员和学生模板。
这是流程路由器开发人员的设计选择吗?
答案 0 :(得分:3)
为什么不将订阅逻辑从路由中移除,并将template level subscriptions与内置Template.subscriptionsReady
帮助器一起使用?
FlowRouter.route('/songs/list', {
name: 'Songs.list',
action: function(params) {
BlazeLayout.render('home');
}
});
<template name="home">
{{#if Template.subscriptionsReady}}
{{#if isAdmin}}
{{> admin_home}}
{{else}}
{{> student_home}}
{{/if}}
{{/if}}
</template>
Template.home.onCreated(function() {
this.subscribe('allUsers', Meteor.userId());
});
Template.home.helpers({
isAdmin: function() {
// check if user is admin
}
});
答案 1 :(得分:1)
尝试: Meteor.subscribe(&#39; allUsers&#39;,{ OnReady(){ if(Meteor.user()。isAdmin){BlazeLayout.render(&#34; admin_home&#34;); } else {BlazeLayout.render(&#34; student_home&#34;); }}
答案 2 :(得分:0)
我认为您所使用的功能是FlowRouter.subsReady
,docs here中提供了如何在路由器(类似于IronRouter)中使用它的示例。
所以在你的情况下,它可能看起来像:
FlowRouter.route('/songs/list', {
name: 'Songs.list',
subscriptions: function(params, queryParams) {
this.register('getUser', Meteor.subscribe('allUsers', Meteor.userId()));
},
action(params, queryParams) {
Tracker.autorun(function() {
var ready = FlowRouter.subsReady("getUser");
Tracker.nonreactive(function(){
if(ready && Meteor.user().isAdmin){
BlazeLayout.render("admin_home");
}
else if(ready){
BlazeLayout.render("student_home");
}
else {
BlazeLayout.render("loading");
}
});
});
}
});