请解释 Meteor 的 Iron Router DATA 和 Subscribe/publish 渲染

Please explain Meteor's Iron Router DATA and Subscribe/publish rendering

我对缺少有关 Iron Router 和 Collections/publish/subscribe 的文档感到沮丧。我有一些 Publish 语句(在站点代码的 isServer 部分),return 数据从 Collections 到客户端。我在这样的路线中称呼他们:

Router.route('/project/:_id', {
  path: '/project/:_id',
  template: 'project',
  waitOn: function(){
    return Meteor.subscribe( "getProject", this.params._id );
  }

此时,我有一个服务器能够将已发布的数据集发送到客户端。我有一个客户要求订阅该数据集。这应该是我需要的功能页面,对吧?但是,当我不包含数据时,Iron Router 向我咆哮:路由中的这样的字段:

data: function() {
  return Projects.find();
}

为什么我需要数据:如果我应该已经在 Meteor.subscribe 上拥有我想要的数据?有人可以解释为什么这是必要的吗?我不想要模板中的 Projects.find() 结果,我想要 Meteor.subscribe("getProject") 的结果。试图在数据中调用 getProject: 部分,但它想要一个集合而不是 publish/subscription.

这令人沮丧,因为这似乎是最基本的任务:呈现页面并使用服务器提供的结果集。我还想念更多的东西吗?基本 LAMP 可以很容易地呈现数据。

是的,您仍然需要在需要从中获取数据的任何集合上调用 find。订阅只是让那些通常只存在于服务器端的数据在客户端可用。订阅会为特定用户提取您需要的内容。例如,您不想要所有项目,您只想要属于当前用户的项目。

如果安装了自动发布包,则不需要订阅,因为 all 客户端将拥有 all 数据;没有它,你只需要指定你需要的。

关于这段代码。

waitOn: function(){
    return Meteor.subscribe( "getProject", this.params._id );
  }

顾名思义,您正在等待客户,获取 "data ready" 又名订阅。

关于其他词 "template data" 上的 data:function() 字段,让我们举个例子。

假设您有这个模板。

<template name="projects">
  <h2>A List Of Projects</h2>
 <!-- here you want to show something like {{projectName}}. --> 
</template>

所以您需要将数据传递到模板中吗?

因此您可以将数据作为 functionobject

传递

你可以通过

data:function(){
  return Projects.find() //for example
} 

data:{
   projects:[{
     title:"example"
      },
      {
     title:"example2"
      }
    ]
 }

您还需要知道,如果您将数据用作函数,则不需要模板上的 {{#each}} 助手,但如果您将其用作对象,则需要执行以下操作

{{#each projects}}
   {{title}}
{{/each}}

或者你可以省略铁路由器上的数据并创建你自己的助手

Template.example.helpers({
  projects:function(){
    return Projects.find(); //this will do the same as data:function(){} iron router method
  }
})

希望你能明白