请解释Meteor的Iron Router DATA和订阅/发布渲染

时间:2015-02-17 00:20:58

标签: meteor iron-router

我对Iron Router和Collections / publish / subscribe缺乏文档感到沮丧。我有一些Publish语句(在站点中的代码的isServer部分),它将数据从集合返回给客户端。我在这样的路线上打电话给他们:

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

此时,我有一台服务器能够将已发布的数据集发送到客户端。我有一个客户要求订阅该数据集。这应该是功能页面所需要的全部内容,对吧?但是,当我没有在路线中包含数据时,铁路由器咆哮着我:

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

为什么我需要一个数据:如果我已经拥有了Meteor.subscribe上我想要的数据?有人可以解释为什么这是必要的吗?我不希望Project.Sfind()结果出现在模板中,我想要Meteor.subscribe的结果(" getProject")。试图在数据中调用getProject:部​​分但它想要一个集合而不是发布/订阅。

这很令人沮丧,因为它似乎是最基本的任务:呈现页面并使用服务器提供的结果集。我错过了什么吗?基本LAMP可以很容易地呈现数据。

2 个答案:

答案 0 :(得分:4)

在这段代码上。

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

就像这个名字说你正在等待客户端,得到“数据就绪”Aka订阅。

关于其他人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
  }
})

希望你明白

答案 1 :(得分:0)

是的,你仍然需要在任何需要数据的集合上调用find。订阅只会使客户端可用的数据(通常只存在于服务器端)。订阅会删除给定用户所需的内容。例如,您不想要所有项目,只需要属于当前用户的项目。

如果您安装了自动发布程序包,则不需要订阅,因为所有客户端将全部数据;没有它你只需要指定你需要的东西。