【问题标题】:Get parameters from router with Meteor and iron:router使用 Meteor 和 Iron:router 从路由器获取参数
【发布时间】:2015-02-12 17:39:30
【问题描述】:

我有路线

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

还有一个帮手

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

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

【问题讨论】:

    标签: node.js meteor iron-router meteor-helper


    【解决方案1】:

    通常你会像这样在路由级别设置数据上下文:

    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 参数。

    然后在您的帖子模板中,您可以访问路由器设置的数据上下文,而无需专门的助手。

    <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>
    

    【讨论】:

    • 太棒了!我的帖子列表呢?是否仍应设置为助手? Template.posts.helpers({ posts: function () { return Posts.find(); } });
    • 编辑了我的帖子以提供我对此的见解。
    【解决方案2】:

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

    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;
        }
    });
    

    【讨论】:

    • 我认为我同意它更有条理,但 saimeunt 说数据通常设置在路由器中。 Meteor 是否提到过一些首选的方法?在代码中的同一位置设置 waitOn 和数据获取点也是有意义的。
    • @Jamgreen 添加了 waitOn 示例。我认为订阅更像是广泛的数据点,所以我们可以在路由器中拥有它而忘记。但是对于我们在视图中使用的特定数据变量,最好自己放入帮助程序(其他开发人员更容易找到,因为他们将首先查看帮助文件)。
    • 如果我想在助手内部的多个函数中使用postId怎么办?将var postId = Router.current().params._id;设置在Template.post.helpers({之上可以吗?
    • 我猜Template.post.helpers({ 之外的任何东西都不会反应。
    猜你喜欢
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 2015-01-07
    • 2016-07-27
    相关资源
    最近更新 更多