这是在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/
与/posts/_id
相同的帖子。
它明白应该链接到这篇文章,巧妙地将网址设置为whatever
。
这很可能是错误的,并且它无法解释为什么在_id
转换为{{1}}时它会起作用。但是,以极其类似的方式解析它会对我有所帮助。
编辑:清理我的问题,以便更容易掌握。
答案 0 :(得分:1)
有一系列简单的情况会导致混淆:
Posts.findOne
问题的解释是第一个参数可以 选择器或文档_id
。所以这不是一个捷径,而是一个documented feature。:something
放入iron:路由器URL会导致该值在路由功能中报告为this.params.something
。此还将something
注册为该路线的参数,这使我们了解pathFor
的工作原理。pathFor
助手需要两个输入:首先是路由的名称(在本例中为'postPage'
),第二个是参数对象,它们可以来自第二个参数,如{{1或者来自数据上下文,如:{{pathFor 'postPage' params}}
。现在,这就是为什么在调用参数{{#with params}}{{pathFor 'postPage'}}{{/with}}
时从数据库传入文档的工作原理,但是如果你调用它_id
则没有:你从数据库中检索的post对象_有{{{ 1}}字段,但它没有whatever
字段。因此,当您将其传递到_id
时,如果路由的参数恰好也被称为whatever
,它只会传递正确的pathFor
。
如果这有意义,请告诉我,我同意这有点令人困惑,而且这个“捷径”隐藏了_id
和_id
实际上做的事情。