我对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可以很容易地呈现数据。
答案 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>
所以你需要将数据传递给模板吗?
因此,您可以将数据作为function
或object
你可以通过
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。订阅只会使客户端可用的数据(通常只存在于服务器端)。订阅会删除给定用户所需的内容。例如,您不想要所有项目,只需要属于当前用户的项目。
如果您安装了自动发布程序包,则不需要订阅,因为所有客户端将全部数据;没有它你只需要指定你需要的东西。