【问题标题】:Please explain Meteor's Iron Router DATA and Subscribe/publish rendering请解释 Meteor 的 Iron Router DATA 和订阅/发布渲染
【发布时间】:2015-04-17 15:04:10
【问题描述】:

我对 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 );
  }

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

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

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

这令人沮丧,因为这似乎是最基本的任务:渲染页面并使用服务器提供的结果集。我还缺少什么吗? Basic LAMP 可以非常轻松地呈现数据。

【问题讨论】:

    标签: meteor iron-router


    【解决方案1】:

    关于这段代码。

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

    就像名字说的那样,你正在等待客户,准备好“数据”,也就是订阅。

    关于其他词“模板数据”上的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}}
    

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

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

    希望你得到它

    【讨论】:

    • 感谢 Ethaan,但问题是我想在模板中使用的数据不仅仅是一个集合。我正在尝试包含一个子函数,该函数从 Meteor.users 集合中获取有关项目“所有者”的内容。项目的属性之一是 ownerid(Meteor.users 集合中的 _id)。我想从 Meteor.users 集合中提取所有者的电子邮件地址(或其他属性),将其包含在结果集中(或作为模板的函数),因此我可以调用 {{user_email_address}} 或等效项。这在概念上似乎很简单(不是花哨的连接)
    • 所以 Projects.find() 是不够的。但是在meteor publish中,貌似可以在结果集中包含一个子函数。
    • 我的朋友,我真的不明白,你可以把模板放在{{if currentUser}} &lt;!-- show information here --&gt; {{/if}} 或者直接这样做。 {{currentUser.profile.name}}
    • 项目的ownerID不一定是当前登录的用户。
    • Ethaan 在一次在线聊天后帮助了我。我们从 Iron Router 中删除了 data: 字段。然后我们创建了 2 个辅助函数: Template.project.helpers({ showProjects: function() { return { Projects.find() } }, owerInformation:function(owna) { return Meteor.users.find({_id:owna}) ; } 我还没有让这段代码 100% 工作 - owerInformation:function 似乎还不喜欢我传递给它的变量,但是这种方法(使用模板帮助器)看起来比尝试发布更容易/subscribe。我会继续这样玩,看看我能走多远。
    【解决方案2】:

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

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

    【讨论】:

    • 我知道订阅打开了数据结果集的大门。这是我想在我的页面上呈现的数据,因为它包含服务器逻辑来组装并将该数据返回给客户端。那为什么我需要在 data: 字段中设置 SECOND 结果集? Iron Router 似乎需要 2 个结果集来呈现我的 Route。我错过了什么吗?
    • 之前的评论指的是需要一个 data: 字段。当我已经订阅了我想要的数据时,为什么还需要它?
    猜你喜欢
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2015-07-07
    • 1970-01-01
    • 2014-02-01
    • 2017-01-19
    • 2015-03-06
    相关资源
    最近更新 更多