等待Flow Router中的订阅

时间:2016-06-11 16:25:47

标签: meteor iron-router flow-router

目标我希望根据在订阅电话后检索的文档,从我的流路由器功能中呈现模板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,用于呈现管理员和学生模板。

这是流程路由器开发人员的设计选择吗?

3 个答案:

答案 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
    }
});

这种方法也recommended in FlowRouter docs

答案 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.subsReadydocs 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");
                }

            });
        });
    }
});