通过 iron:router 显示操作,模板未从 collection.findOne 方法传递数据

Show Action via iron:router, template isn't passed data from a collection.findOne method

我无法获取模型实例的 'show' 页面来显示其数据。

这是不会显示其数据的模板:

<template name="priority">
  <h1>Priority: {{title}}</h1>
</template>

它本身非常简单,但我无法显示 title。 Iron:router 使用以下代码将我们引导至此页面:

Router.route('/priority/:_id', function(){
  var priority = this.params._id; 
  this.render('priority', {
    data: function(priority){
      Meteor.call('showPriority', priority, function(error){
        if (error) {
          console.log("An error has occured: " + error); 
        }
      })
    }
  })
},  {
  name: 'priority.show'
});

Meteor.method很简单,就是查询变量priority:

'showPriority': function(priority) { 
    return Priorities.findOne({_id: priority});
  }

带href的视图在这里:

<template name="priorityList">
  <ul class="table-view">
    {{#each this}}
    <li class="table-view-cell">
      {{title}}
      <a href="{{pathFor route="priority.show"}}"><span class="pull-right icon icon-edit"></span></a>
    </li>
    {{/each}}
  </ul>
</template>

请注意,此视图显示所有 优先级 的列表。当我检查 href 时,所有路径都是使用 _id:

动态生成的
<a href="/priority/yYihyZmZ2xkAso7i5">...

哦,我应该提一下,我也尝试使用 waitOn 方法,因为我认为我可能会在数据之前加载模板,但这也没有帮助...

Router.configure({
  ...
  waitOn: function(){
    return Meteor.subscribe('priorities');
  }
});

这么多代码,只是为了展示发生了什么!

这是怎么回事?为什么我的 "show" 模板没有给我任何数据?

改变你的路线。

Router.map(function () {
  this.route('priority', {
    path: '/priority/:_id',
    waitOn: function(){
        return Meteor.subscribe('priorities',this.params._id);
    },
    data: function(){
      if(this.ready()){
         return Priorities.findOne({_id: this.params._id});
       }else{
        this.render('loading') //if data not ready we render some loading template
      }
    }
  });
});

您不需要为 find(); 制作 Meteor.call,而是 data:function()

上的所有内容

以上只是一个例子,所以你可以理解这个想法,但它应该可以工作,因为你期望 _id:priority_id:this.params._id 它是一样的。

请确保您已删除 自动发布包

并按顺序排列 subscriptions/publish

Meteor.publish('Menu', function(){
          return Priorities.find();
        });