我有路线
Router.route('/post/:_id', {
name: 'post',
template: 'post'
});
和一个帮手
Template.post.helpers({
post: function () {
return Posts.findOne(this._id);
}
});
它不会找到指定的帖子。但我想我以错误的方式获取 id。我见过一些他们使用会话的项目。这真的有必要吗?不能从路由器获取参数吗?
我有路线
Router.route('/post/:_id', {
name: 'post',
template: 'post'
});
和一个帮手
Template.post.helpers({
post: function () {
return Posts.findOne(this._id);
}
});
它不会找到指定的帖子。但我想我以错误的方式获取 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
.
然后在您的帖子模板中,您可以访问路由器设置的数据上下文,而无需专门的帮助程序。
<template name="post">
post id is {{_id}}
</template>
就帖子列表而言,您可以坚持相同的模式:
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>
将所有数据获取点放在助手中会更有条理。所以你可以这样做:
路由.js
Router.route('/post/:_id', {
name: 'post',
template: 'post'
});
post.js
Template.post.helpers({
post: function() {
var postId = Router.current().params._id;
return Posts.findOne({_id: postId});
}
});
请记住,如果您没有在任何其他文件中订阅(帖子),您可以在路由器本身中订阅:
routes.js(订阅)
Router.route('/post/:_id', {
name: 'post',
template: 'post',
waitOn: function() {
return Meteor.subscribe('posts');
}
});
更新:
Router.current().params._id
似乎有问题,它将返回之前运行的该路线的所有 Id。
所以重组的方式应该是(来自我的应用程序的例子):
路由.js
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
}
});
游戏.js
Template.gamesPlay.helpers({
game: function() {
var gameId = Session.get('gameId'); //instead of Router.current().params.gameId;
var game = Games.findOne({_id: gameId});
return game;
}
});