在Iron Router onBeforeAction中使用集合

时间:2015-02-28 09:44:26

标签: meteor iron-router

我是一个名为Tabs的集合和一个以tabId作为其路由参数的动态路由。标签具有布尔属性'已发布'并且我想将用户重定向回根网址,如果他们访问了相应标签记录已发布的路线#' 39;是假的。

为了做到这一点,我想我可以在onBeforeAction中获取记录并检查它,但是由于某种原因未定义从订阅返回的游标。

路线:

viewTabController = RouteController.extend({
  layoutTemplate: 'storeLayout',
  subscriptions: function() {
    var tabId    = this.params.tabId;
    var sourceId = readCookie(Purchases.COOKIE_IDENTIFIER(tabId));

    this.sub     = Meteor.subscribe("itemData", tabId, sourceId);
  },
  data: function() {
    var tabId = this.params.tabId;
    return {
      tab:      Tabs.findOne(tabId),
      ready:    this.sub.ready
    };
  },
  onBeforeAction: function() {
    if (this.sub.ready) {
      var tab      = Tabs.findOne(); <------------ undefined
      var purchase = Purchases.findOne(); <-------------- undefined

      console.log(tab, purchase);

      if (!_.isUndefined(purchase)) {
        console.log('go receipt');
        // Router.go('receipt', { purchaseId: purchase._id });
      } else if (!tab.isPublished()) {
        console.log('is not Published');
      } else {
        console.log('view tab');
      }
    }
    this.next();
  },
  onAfterAction: function() {
    SEO.set({
      title: 'View Tab | ' + SEO.settings.title
    });
  },
  fastRender: true
});

Router.route('viewTab', {
  path: '/tabs/:tabId',
  controller: viewTabController
});

使用publishComposite发布:

/*
 * Returns tab matching ID
 */
Meteor.publishComposite("itemData", function(tabId, sourceId) {
  check(tabId, String);

  return {
    find: function() {
      return Tabs.find({ _id: tabId }, { fields: { downloadUrl: 0, s3key: 0, createdAt: 0 } });
    },
    children: [
      {
        find: function(tab) {
          return Users.find({ _id: tab.userId }, { fields: { username: 1 } });
        }
      },
      {
        find: function(tab) {
          return Purchases.find({ tabId: tabId, sourceId: sourceId });
        }
      }
    ]
  };
});

这是错误的做法还是我错过了什么?

1 个答案:

答案 0 :(得分:0)

这可能不是答案,但我希望它会有所帮助。

问题在于Tabs&amp;当它应该被使用时,Purchases.FindOne()还没有准备好,please read this great post for clarification