Meteor发布和订阅不起作用

时间:2015-12-04 00:15:47

标签: javascript meteor

我有一个相当新手的问题,我希望有人可以帮助我。

我有以下代码,其中订阅/发布不起作用:

if (Meteor.isServer) {

  Meteor.publish('items', function () {
     return Items.find({});
   });

}


if (Meteor.isClient) {
  Meteor.subscribe("items");

}

在我的模板中:

<template name="items">

  <div class="ui segment">
   <div class="ui relaxed list">
     {{#each item in items}}
     <div class="item">
        <img class="ui avatar image" src="http://placehold.it/20x20">
           <div class="content">
             <a class="header">{{item.text}} 

           </div>
           <button class="delete">&times;</button>
      </div>
      {{/each}}
   </div>
  </div>

</template>

但没有任何东西可以输出。但是,当我添加:

 Template.items.helpers({
      items: function () {
        return Items.find({});
      }
    });

我确实看到了清单。为什么会这样?另外,我很清楚为什么有人会想要使用订阅/发布以及模板助手。

2 个答案:

答案 0 :(得分:1)

您必须使用与publish()中使用的名称相同的subscribe()。在你的情况下(注意'项目'):

/服务器:

Meteor.publish('items', function () {
   return Items.find({});
});

/客户端:

if (Meteor.isClient) {
  Meteor.subscribe('items');
}

发布/订阅链接告诉meteor将'Items'集合中的所有文档发送到客户端上的minimongo。现在,模板帮助程序的目的是告诉meteor,当文档在Items中发生更改时,您希望反应性地更新模板。

关于这个主题的一个很好的参考:https://www.discovermeteor.com/blog/understanding-meteor-publications-and-subscriptions/

答案 1 :(得分:1)

我建议你阅读Data flow from the database to the UI: Three layers of Meteor

您正在创建标记为items的出版物。然后您订阅了标有deals的出版物。这不起作用,因为标签必须匹配订阅才能工作。

如果添加template helper然后在用户界面中显示数据,则您的应用中必须包含autopublish个包。它将是自动发布,而不是您的发布/订阅,即向客户端发送客户端放入迷你mongo Items集合中的数据。

因此pub / sub将数据从服务器获取到客户端,但不显示它。这就是为什么你需要template helper来从客户端的mini-mongo集合中获取模板所需格式的原因。