客户端订阅不接收来自Meteor服务器发布的数据

时间:2013-05-25 22:44:18

标签: meteor

我现在已经把头撞到墙上一段时间了,我想我在这里错过了一些简单的东西。

我在Meteor服务器上运行它:

// --- Collections ---
Projects = new Meteor.Collection('projects');
Team = new Meteor.Collection('team');

// --- Only publish user data for users on my team ---
Meteor.publish('team', function() {
    var team = Meteor.users.findOne({_id: this.userId}).profile._team;
    console.log(Meteor.users.find({'profile._team': team}, {fields: {_id: 1, profile: 1}}).fetch());
    return Meteor.users.find({'profile._team': team}, {fields: {_id: 1, profile: 1}});
});

通过对profile._team属性中与当前登录用户具有相同ID的所有用户文档运行查询,查找位于同一“团队”的所有用户。您将在发布函数中看到console.log(...);(在return语句之前的行),并且它正确地将我期望它的文档记录到终端中。

现在我在我的客户端上运行它:

// --- Data ---
Meteor.subscribe('team');
Team = new Meteor.Collection('team');

Template.team.team = function() {
    console.log(Team.findOne());
    return Team.find();
};

但是,console.log(Team.findOne())始终记录未定义,Team.find()始终返回空数组。我做错了什么是阻止我的文件到达客户端?

更新:以下是模板代码。

<body>
    {{> team}}
</body>

<template name="team">
    <p>TEAM TEMPLATE WORKS</p>
    {{#each team}}
        <p>TEAM EACH WORKS</p>
        <div class="teamMember">
            {{profile.firstName}} {{profile.lastName}}
        </div>
    {{/each}}
</template>

“TEAM EACH WORKS”永远不会在{{#each}}标记内呈现,但“TEAM TEMPLATE WORKS”在放置在{{#each}}标记之前时会按预期呈现。

2 个答案:

答案 0 :(得分:3)

问题在于:

在客户端上,您可以引用集合team

Team = new Meteor.Collection('team');

但是,在服务器发布功能中,您将光标返回到users

return Meteor.users.find({'profile._team': team}, {fields: {_id: 1, profile: 1}});

没有发布team的文件。实际上,您甚至不在服务器代码中使用TeamProjects

旧回答:

尝试删除console.log(teamMates.fetch());或添加teamMates.rewind()

来自docs

  

forEach,map或fetch方法只能在游标上调用一次。要多次访问光标中的数据,请使用rewind重置光标。

答案 1 :(得分:2)

使用meteor订阅team需要很短的时间。虽然这样做Team.findOne()将返回undefined,Team.find()将返回一个空数组。

如果您等待一两秒钟,客户端上显示的数据应该匹配。

您确实将return Team.find()放置在模板帮助程序中,该帮助程序是被动的。因此,只要数据到达客户端,只要您的HTML中包含使用{{#each team}}帮助程序

的内容,UI就会显示更新的数据