添加路由器以按流星中的人名查看帖子

时间:2014-05-29 01:29:21

标签: javascript meteor iron-router

我是网络开发的新手,我正在学习Meteor。我几乎都在关注Discover Meteor的书,但当我稍微偏离时,我收到了一个错误。

以下代码工作正常,永久链接的工作原理如下:

router.js

Router.configure({
  layoutTemplate: 'layout',
  loadingTemplate: 'loading',
  waitOn: function() {return Meteor.subscribe('allPosts')}
});


Router.map(function() { 
    this.route('postsList', {path: '/'});

    this.route('postPage', {
        path: '/posts/:_id',
        data: function(){return Posts.findOne(this.params._id)}
    });
});

Router.onBeforeAction('loading');

但是当我将以下内容添加到Router.map时,它无法正常工作:

this.route('byName',{
    path: '/posts/:name',
    data: function(){return Posts.findOne({name: this.params.name})}
})

要清楚,我将展示我的模板:

<template name = 'byName'>
    {{> postItem}}
</template>

<template name = 'postPage'>
    {{> postItem}}
</template>

我的post_item.html:

<template name = 'postItem'>
    <div class = "post">    
        Name: {{name}}, Post: {{post}}
        <a href = "{{pathFor 'postPage'}}">See Post</a>, 
        <a href = "{{pathFor 'byName'}}">By Name</a>
    </div>
</template>

当我点击帖子的“看帖子”时

Name: Wonder Woman, Post: Hera, give me strength! See Post, By Name

我收到同样的帖子。但是当我点击By Name时,我得到了

Name: , Post: See Post, By Name

没有填写任何值。我究竟做错了什么?感谢。

1 个答案:

答案 0 :(得分:1)

尝试在每个路线的数据参数中添加console.log()语句......就像这样:

     this.route('postPage', {
          path: '/posts/:_id',
          data: function(){
            console.log("route -> postPage")
            return Posts.findOne(this.params._id)
          }
      });

      this.route('byName',{
          path: '/posts/:name',
          data: function(){
            console.log("route -> byName");
            return Posts.findOne({name: this.params.name})
          }
      });

我想你会看到这个问题。我不确定您要通过示例尝试实现的目标,因此我不确定是否有特定方法可以解决您的问题。但是,我会提供一个选项,因此您可以看到以下内容可行:

  this.route('byName',{
      path: '/posts/name/:name',
      data: function(){
        console.log("route -> byName");
        return Posts.findOne({name: this.params.name})
      }
  });

请注意我是如何给它一个不同的匹配路径的?

在您的示例中,您的路径基本相同(由于参数名称,它们看起来不同,但它们都指向/posts/<string>)。由于铁路由器遍历路由以便正确处理路径,因此它会遇到postPage路由,该路由首先匹配模式。该路由查找单个Post_id等于某个字符串(传递的name),并显示为空。您可以切换定义路径的顺序(将byName置于postPage之上),然后byName将起作用,另一个将为空。

希望有所帮助。