iron-router在waitOn函数中选择不同的订阅 - Meteor

时间:2014-09-20 13:51:58

标签: javascript meteor iron-router

我想根据文档(mode)中的布尔属性来决定用户获得的订阅,但我遇到了设计方法的问题。如果我在this.data()函数中使用waitOn和if子句,我将获得404页面,因为我首先需要订阅。

这是我的代码:

this.route('gamePage', {
        path: '/game/:slug/viewGame/:produceDate?/:releaseDate?',
        onBeforeAction: [memberFilter],
        waitOn: function() {
            var game = this.data();
            if (game.mode) {
                if (this.params.produceDate && this.params.releaseDate) {
                    return [Meteor.subscribe('singleGame', this.params.slug),
                        Meteor.subscribe('authorsMode', this.params.slug, this.params.produceDate, this.params.releaseDate)];
                } else {
                    return [Meteor.subscribe('singleGame', this.params.slug), Meteor.subscribe('console', this.params.slug)];
                }
            } else {
                return [Meteor.subscribe('singleGame', this.params.slug),
                    Meteor.subscribe('authors', this.params.slug)];

            }
        },
        data: function() {
            return Games.findOne({slug: this.params.slug});
        }

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

要直接实现这一点,您需要Iron Router让您拥有2个级别的订阅,第一个级别使数据可用于下一级订阅。此功能现在不存在。我刚刚向IR repo提交了issue,要求提供此功能。

解决方法是针对每种情况使用不同的URL,进行中间重定向:

this.route('gamePage', {
  path: '/game/:slug/viewGame/:produceDate?/:releaseDate?',
  onBeforeAction: function() {
    var game = this.data();
    var params = {
      slug: this.params.slug,
      produceDate: this.params.produceDate,
      releaseDate: this.params.releaseDate
    }
    if (game.mode) {
      if (this.params.produceDate && this.params.releaseDate) {
        this.redirect('gamePageOption1', params);
      } else {
        this.redirect('gamePageOption2', params);
      }
    } else {
      this.redirect('gamePageOption3', params);
    }
  },
  waitOn: function() {
      return [Meteor.subscribe('games')];
  },
  data: function() {
      return Games.findOne({slug: this.params.slug});
  }
}

如果您使用的是IR v< 0.9.3了解有关中间重定向的问题:ref1ref2。如果是这种情况,则必须在Meteor.defer

内进行重定向
Meteor.defer(function() {
    this.redirect(...)
})