3

我有路线

Router.route('/post/:_id', {
  name: 'post',
  template: 'post'
});

和一个帮手

Template.post.helpers({
  post: function () {
    return Posts.findOne(this._id);
  }
});

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

4

2 回答 2

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>
于 2014-12-14T15:37:31.697 回答
0

将所有数据获取点放在助手中会更有条理。所以你可以这样做:

路由.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;
    }
});
于 2015-07-06T09:57:39.283 回答