这是在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
。
让我知道这是否有意义,我同意这有点令人困惑,并且该“快捷方式”隐藏了pathFor
和params
实际执行的操作。