这是在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的源代码,所以我希望这里的人可以以甚至像我这样的初学者都可以理解的方式对其进行解释。 。

最好像这样:


首先{{pathFor 'postPage'}}在路线内部查找以查找名为postPage的路线。
它看到此路由对应于/posts/,后跟其他内容。
查看数据上下文内部,发现仅返回一个帖子,即与_id之后的内容具有相同/posts/的帖子。
据了解,它应该链接到此帖子,将URL巧妙地设置为/posts/_id


这很可能是错误的,并且没有解释为什么将whatever转换为_id时为什么会起作用。但这将极大地帮助我看到以类似的方式进行解析。

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

最佳答案

有几种简单的情况共同导致混乱:


Posts.findOne问题由以下事实解释:第一个参数可以是选择器,也可以是文档_id。因此,它实际上不是快捷方式,而是documented feature
如您所见,将:something放在iron:router URL中会使该值在route函数内报告为this.params.something。这还将something注册为该路由的参数,这使我们了解pathFor的工作方式。
pathFor帮助器有两个输入:第一个是路由名称(在本例中为'postPage'),第二个是参数对象,它可以来自{{pathFor 'postPage' params}}中的第二个参数,也可以来自数据上下文,例如:{{#with params}}{{pathFor 'postPage'}}{{/with}}


现在,这就是为什么在调用参数_id时从数据库传递文档的原因,但如果调用whatever则不行:从数据库检索的post对象_has有一个_id字段,但是没有。没有whatever字段。因此,当您将其传递到pathFor时,仅当路由参数也恰好称为_id时,它才传递正确的_id

让我知道这是否有意义,我同意这有点令人困惑,并且该“快捷方式”隐藏了pathForparams实际执行的操作。

09-25 15:38