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({
之外的任何内容都不会是被动的,我想。