我现在已经把头撞到墙上一段时间了,我想我在这里错过了一些简单的东西。
我在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}}
标记之前时会按预期呈现。
答案 0 :(得分:3)
问题在于:
在客户端上,您可以引用集合team
:
Team = new Meteor.Collection('team');
但是,在服务器发布功能中,您将光标返回到users
:
return Meteor.users.find({'profile._team': team}, {fields: {_id: 1, profile: 1}});
没有发布team
的文件。实际上,您甚至不在服务器代码中使用Team
和Projects
。
旧回答:
尝试删除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}}
帮助程序