使用 arg 时,名为 routes pathFor 的 Iron Router 为空
Iron Router named routes pathFor is null when using arg
Iron Router / Meteor 示例似乎都在命名路由中使用 _id
,这很有效。但是,为了使用 _id
以外的集合中另一个键的命名路由,我遗漏了一些东西。具体来说,我正在使用 tag
键。
'/标签'路线
此标记列表路由按预期工作:http://localhost:3000/tags
Router.route('/tags', {
name: 'demoTagsList',
waitOn: function() {
return Meteor.subscribe('tags');
},
data: function() {
return Tags.find();
}
});
demoTagItem
的 pathFor
按预期工作
<a href="{{pathFor 'demoTagsList'}}">Tags</a>
和Router.routes['demoTagsList'].url()
一样 --> "<a href="http://localhost:3000/tags" rel="nofollow">http://localhost:3000/tags</a>"
'/tags/:_tag' 路线
这个特定的标记路由也按预期工作,returns 适当的数据:http://localhost:3000/tags/foo-tag
Router.route('/tags/:_tag', {
name: 'demoTagItem',
waitOn: function() {
return Meteor.subscribe('itemsFromTag', this.params._tag);
},
data: function() { return Posts.find({tags: this.params._tag}); }
});
但是,每个 demoTagItem
路线的 pathFor
会导致 null
。
Router.routes['demoTagItem'].url()
--> “http://localhost:3000null”
模板代码:
<template name="demoTagsList">
<h2>Demo Tag list</h2>
<ul>
{{#each tags}}
<li class="tag"><a href="{{pathFor 'demoTagItem'}}">#{{name}}</a></li>
{{/each}}
</ul>
</template>
设置路由器路径需要做什么,以便 pathFor
选择 {{name}}
并将 link 构建为 tags/tag-name
?
如果您查看 pathFor docs,您会发现该函数需要一个 data
上下文来填充路由中的参数。您可以使用模板助手显式设置 data
,如下所示:
<li class="tag"><a href="{{pathFor 'demoTagItem' data=getTag}}">#{{name}}</a></li>
其中 getTag
是一个模板助手,returns 一个像 {_tag: 'puppies'}
.
这样的对象
但是,阻力最小的方法通常是将路由参数设置为与标签对象本身具有相同的字段名称。假设你的标签有 name
属性,你可以这样修改你的路线:
Router.route('/tags/:name', {
name: 'demoTagItem',
waitOn: function() {
return Meteor.subscribe('itemsFromTag', this.params.name);
},
data: function() { return Posts.find({tags: this.params.name}); }
});
现在您的模板不需要对原始代码进行任何修改,因为上下文已经是一个标签。这应该相当于写 data=this
其中 this
看起来像 {name: 'puppies'}
.
Iron Router / Meteor 示例似乎都在命名路由中使用 _id
,这很有效。但是,为了使用 _id
以外的集合中另一个键的命名路由,我遗漏了一些东西。具体来说,我正在使用 tag
键。
'/标签'路线
此标记列表路由按预期工作:http://localhost:3000/tags
Router.route('/tags', {
name: 'demoTagsList',
waitOn: function() {
return Meteor.subscribe('tags');
},
data: function() {
return Tags.find();
}
});
demoTagItem
的 pathFor
按预期工作
<a href="{{pathFor 'demoTagsList'}}">Tags</a>
和Router.routes['demoTagsList'].url()
一样 --> "<a href="http://localhost:3000/tags" rel="nofollow">http://localhost:3000/tags</a>"
'/tags/:_tag' 路线
这个特定的标记路由也按预期工作,returns 适当的数据:http://localhost:3000/tags/foo-tag
Router.route('/tags/:_tag', {
name: 'demoTagItem',
waitOn: function() {
return Meteor.subscribe('itemsFromTag', this.params._tag);
},
data: function() { return Posts.find({tags: this.params._tag}); }
});
但是,每个 demoTagItem
路线的 pathFor
会导致 null
。
Router.routes['demoTagItem'].url()
--> “http://localhost:3000null”
模板代码:
<template name="demoTagsList">
<h2>Demo Tag list</h2>
<ul>
{{#each tags}}
<li class="tag"><a href="{{pathFor 'demoTagItem'}}">#{{name}}</a></li>
{{/each}}
</ul>
</template>
设置路由器路径需要做什么,以便 pathFor
选择 {{name}}
并将 link 构建为 tags/tag-name
?
如果您查看 pathFor docs,您会发现该函数需要一个 data
上下文来填充路由中的参数。您可以使用模板助手显式设置 data
,如下所示:
<li class="tag"><a href="{{pathFor 'demoTagItem' data=getTag}}">#{{name}}</a></li>
其中 getTag
是一个模板助手,returns 一个像 {_tag: 'puppies'}
.
但是,阻力最小的方法通常是将路由参数设置为与标签对象本身具有相同的字段名称。假设你的标签有 name
属性,你可以这样修改你的路线:
Router.route('/tags/:name', {
name: 'demoTagItem',
waitOn: function() {
return Meteor.subscribe('itemsFromTag', this.params.name);
},
data: function() { return Posts.find({tags: this.params.name}); }
});
现在您的模板不需要对原始代码进行任何修改,因为上下文已经是一个标签。这应该相当于写 data=this
其中 this
看起来像 {name: 'puppies'}
.