为什么我需要调用动态路由“:_id”而不是我想要的?

时间:2015-04-25 02:21:10

标签: javascript meteor iron-router

这是在Iron Router中设置路由的一种相当标准的方法:

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

尝试一下,初学者和我一样,我试过了:

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

这很有效,一直到位。是的,whatever将获取/posts/之后的任何值作为其值,并且数据上下文确实与之前相同......但现在链接到特定帖子将不起作用!

所以,

<a href="{{pathFor 'postPage'}}">{{title}}</a>

根本无法按照“我的”方式行事(完全没有任何关系)。

我无法完全理解这一点,而且我对掌握Iron Router的源代码太过新手了,所以我希望有人能以这样的方式解释它,即使像初学者一样我能理解。

喜欢像这样的东西:

  1. 首先{{pathFor 'postPage'}}查看路线内部以找到名为postPage的路线。

  2. 它看到此路线对应/posts/后跟其他内容。

  3. 查看数据上下文,它发现只返回了一个帖子,即_id之后/posts//posts/_id相同的帖子。

  4. 它明白应该链接到这篇文章,巧妙地将网址设置为whatever

  5. 这很可能是错误的,并且它无法解释为什么在_id转换为{{1}}时它会起作用。但是,以极其类似的方式解析它会对我有所帮助。

    编辑:清理我的问题,以便更容易掌握。

1 个答案:

答案 0 :(得分:1)

有一系列简单的情况会导致混淆:

  1. Posts.findOne问题的解释是第一个参数可以 选择器或文档_id。所以这不是一个捷径,而是一个documented feature
  2. 如您所见,将:something放入iron:路由器URL会导致该值在路由功能中报告为this.params.something。此something注册为该路线的参数,这使我们了解pathFor的工作原理。
  3. pathFor助手需要两个输入:首先是路由的名称(在本例中为'postPage'),第二个是参数对象,它们可以来自第二个参数,如{{1或者来自数据上下文,如:{{pathFor 'postPage' params}}
  4. 现在,这就是为什么在调用参数{{#with params}}{{pathFor 'postPage'}}{{/with}}时从数据库传入文档的工作原理,但是如果你调用它_id则没有:你从数据库中检索的post对象_有{{{ 1}}字段,但它没有whatever字段。因此,当您将其传递到_id时,如果路由的参数恰好也被称为whatever,它只会传递正确的pathFor

    如果这有意义,请告诉我,我同意这有点令人困惑,而且这个“捷径”隐藏了_id_id实际上做的事情。