在服务器上的铁路由器中的参数

时间:2015-01-30 06:23:54

标签: meteor iron-router

我有一条非常简单的路线:

Router.route("/prospects/:_id", {
  name: "show.prospect",
  controller: "ProspectController"
});

路由到以下路由控制器。

ProspectController = RouteController.extend({
  waitOn: function() {
    return [Meteor.subscribe("hits"), Meteor.subscribe("prospects")];
  },
  action: function() {
    return this.render('showProspect', {
      data: function() {
        var hits,
            prospect;
        // Without this line things blow up because this.params doesn't exist when executing this code on the server.
        if (Meteor.isServer)
          return;
        prospect = Prospects.findOne({ _id: this.params._id });
        hits = Hits.find({
          prospectId: prospect._id
        }, {
          sort: {
            createdAt: -1
          },
          limit: 6
        });
        return {
          prospect: prospect,
          hits: hits
        };
      }
    });
  }
});

如果我尝试执行以下行:

prospect = Prospects.findOne({ _id: this.params._id });

它没有找到潜在客户,我已经了解到这是因为当代码在服务器上运行时this.params未定义。

有谁知道为什么会这样?我没有看到它为什么在客户端而不是服务器上可用的区别。控制器在 both 文件夹中定义,因此它可供客户端和服务器使用。我应该在客户端文件夹中定义它吗?

根据this问题,在两者中定义它是正确的方法。

2 个答案:

答案 0 :(得分:0)

让我们这样做。

ProspectController = RouteController.extend({
      waitOn: function() {
        return [Meteor.subscribe("hits"), Meteor.subscribe("prospects")];
      },
      action: function() {
        return this.render('showProspect', {
          data: function() {
            if(this.ready()){
            var hits,
                prospect;
            // Without this line things blow up because this.params doesn't exist when executing this code on the server.
            if (Meteor.isServer)
              return;
            prospect = Prospects.findOne({ _id: this.params._id });
            hits = Hits.find({
              prospectId: prospect._id
            }, {
              sort: {
                createdAt: -1
              },
              limit: 6
            });
            return {
              prospect: prospect,
              hits: hits
            };
          }
          }
        });
      }
    });

我们在这里添加了if(this.ready()){},只是为了确保我们在数据准备就绪时进行查找,就像你在一起使用waitOn and data一样,你应该这样做。已经。

看看here

答案 1 :(得分:0)

这似乎不是你的问题,而且帖子相当陈旧,但我遇到了一个非常类似的问题:this.params未定义。我的问题是我的控制器中有一个自定义构造函数,我忘了调用RouteController的构造函数。因此,大多数RouteController的字段未设置。我需要修复的只是从我的控制器的构造函数中调用RouteController的构造函数。在Coffeescript中,单个

super

声明已经足够了。