Node.js 使用Meteor和iron:router从路由器获取参数
我有一条路线Node.js 使用Meteor和iron:router从路由器获取参数,node.js,meteor,iron-router,meteor-helper,Node.js,Meteor,Iron Router,Meteor Helper,我有一条路线 Router.route('/post/:_id', { name: 'post', template: 'post' }); 还有一个助手 Template.post.helpers({ post: function () { return Posts.findOne(this._id); } }); 它找不到指定的帖子。但我想我弄错了身份证。我看到一些项目使用了会话。这真的有必要吗?难道不能从路由器获取参数吗?通常您会在路由级别设置数据上下文,如下所
Router.route('/post/:_id', {
name: 'post',
template: 'post'
});
还有一个助手
Template.post.helpers({
post: function () {
return Posts.findOne(this._id);
}
});
它找不到指定的帖子。但我想我弄错了身份证。我看到一些项目使用了会话。这真的有必要吗?难道不能从路由器获取参数吗?通常您会在路由级别设置数据上下文,如下所示:
Router.route("/post/:_id",{
name:"post",
template:"post",
waitOn:function(){
return this.subscribe("post",this.params._id);
},
data:function(){
return Posts.findOne(this.params._id);
}
});
在RouteController
方法中,您可以使用this.params.parameterName
访问URL参数
然后,在post模板中,您可以访问路由器设置的数据上下文,而无需专门的助手
<template name="post">
post id is {{_id}}
</template>
帖子id为{{u id}
就帖子列表而言,您可以坚持相同的模式:
Router.route("/posts",{
name:"posts",
template:"posts",
waitOn:function(){
return this.subscribe("posts");
},
data:function(){
return {
posts:Posts.find()
};
}
});
<template name="posts">
{{#each posts}}
{{> postItem}}
{{/each}}
</template>
Router.route(“/posts”{
名称:“职位”,
模板:“帖子”,
waitOn:function(){
返回此。订阅(“帖子”);
},
数据:函数(){
返回{
posts:posts.find()
};
}
});
{{{#每个帖子}
{{>positem}
{{/每个}}
将所有数据提取点放在helpers中更具组织性。所以你可以这样做:
routes.js
Router.route('/post/:_id', {
name: 'post',
template: 'post'
});
Template.post.helpers({
post: function() {
var postId = Router.current().params._id;
return Posts.findOne({_id: postId});
}
});
Router.route('/play/:gameId', {
name: 'play',
template: 'gamesPlay',
waitOn: function() {
return Meteor.subscribe('games');
},
onBeforeAction: function() {
Session.set('gameId', this.params.gameId);
console.log('game id set '+Session.get('gameId'));
this.next();
},
onStop: function() {
// do something when user navigate away from this route
}
});
Template.gamesPlay.helpers({
game: function() {
var gameId = Session.get('gameId'); //instead of Router.current().params.gameId;
var game = Games.findOne({_id: gameId});
return game;
}
});
post.js
Router.route('/post/:_id', {
name: 'post',
template: 'post'
});
Template.post.helpers({
post: function() {
var postId = Router.current().params._id;
return Posts.findOne({_id: postId});
}
});
Router.route('/play/:gameId', {
name: 'play',
template: 'gamesPlay',
waitOn: function() {
return Meteor.subscribe('games');
},
onBeforeAction: function() {
Session.set('gameId', this.params.gameId);
console.log('game id set '+Session.get('gameId'));
this.next();
},
onStop: function() {
// do something when user navigate away from this route
}
});
Template.gamesPlay.helpers({
game: function() {
var gameId = Session.get('gameId'); //instead of Router.current().params.gameId;
var game = Games.findOne({_id: gameId});
return game;
}
});
请记住,如果您不在任何其他文件中订阅(帖子),您可以在路由器中订阅:
routes.js(带订阅)
更新:
Router.current().params.\u id
似乎有问题,它将返回以前运行的路由的所有id
所以重组的方式应该是(例如我的应用程序):
route.js
Router.route('/post/:_id', {
name: 'post',
template: 'post'
});
Template.post.helpers({
post: function() {
var postId = Router.current().params._id;
return Posts.findOne({_id: postId});
}
});
Router.route('/play/:gameId', {
name: 'play',
template: 'gamesPlay',
waitOn: function() {
return Meteor.subscribe('games');
},
onBeforeAction: function() {
Session.set('gameId', this.params.gameId);
console.log('game id set '+Session.get('gameId'));
this.next();
},
onStop: function() {
// do something when user navigate away from this route
}
});
Template.gamesPlay.helpers({
game: function() {
var gameId = Session.get('gameId'); //instead of Router.current().params.gameId;
var game = Games.findOne({_id: gameId});
return game;
}
});
games.js
Router.route('/post/:_id', {
name: 'post',
template: 'post'
});
Template.post.helpers({
post: function() {
var postId = Router.current().params._id;
return Posts.findOne({_id: postId});
}
});
Router.route('/play/:gameId', {
name: 'play',
template: 'gamesPlay',
waitOn: function() {
return Meteor.subscribe('games');
},
onBeforeAction: function() {
Session.set('gameId', this.params.gameId);
console.log('game id set '+Session.get('gameId'));
this.next();
},
onStop: function() {
// do something when user navigate away from this route
}
});
Template.gamesPlay.helpers({
game: function() {
var gameId = Session.get('gameId'); //instead of Router.current().params.gameId;
var game = Games.findOne({_id: gameId});
return game;
}
});
伟大的那我的帖子列表呢?是否仍应将其设置为助手<代码>模板.posts.helpers({posts:function(){return posts.find();}})编辑了我的帖子,给出了我对这方面的见解。我想我同意它更有条理,但saimeunt说数据通常是在路由器中设置的。Meteor提到过一些更喜欢的方法吗?在代码中,将waitOn和数据获取点放在同一个位置也是有意义的。@Jamgreen添加了waitOn示例。我认为订阅更像是广泛的数据点,所以我们可以把它放在路由器中,然后忘记。但是对于我们在视图中使用的特定数据变量,最好是放入helpers本身(其他开发人员更容易找到,因为他们将首先查看helper文件)。如果我想在helpers中的多个函数中使用
postId
,该怎么办?设置var postId=Router.current().params.\u id上面的代码>模板.post.helpers({
?模板.post.helpers({
之外的任何内容都不会是被动的,我想。