使用Meteor和iron从路由器获取参数:路由器

时间:2014-12-14 14:24:03

标签: 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);
  }
});

它找不到指定的帖子。但我想我是以错误的方式获取身份证。我看过他们使用过会话的一些项目。这真的有必要吗?是不是可以从路由器获取参数?

2 个答案:

答案 0 :(得分:3)

通常你会在路由级别设置数据上下文,如下所示:

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>

答案 1 :(得分:0)

将帮助中的所有数据提取点更加有条理。所以你可以这样做:

<强> routes.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。

所以重组方式应该是(例如我的应用程序):

<强> route.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
    }
});

<强> games.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;
    }
});