使用 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();
   }
});

demoTagItempathFor 按预期工作

<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 会导致 nullRouter.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'}.