我有一条非常简单的路线:
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问题,在两者中定义它是正确的方法。
答案 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
声明已经足够了。