流星中的化合物集合
问题描述:
我使用this tutorial来构建我自己的离子/流星/角度应用程序,并且我达到了删除自动发布和不安全的程度,进入发布和订阅我的数据的程度。流星中的化合物集合
我有我的流星应用的两个蒙戈集合在lib/collections.js
:现在我用下面的挣扎
Players = new Mongo.Collection('players');
Teams = new Mongo.Collection('teams');
玩家有一个_id
和name
,一支球队有一个_id
和数组两(没有更多)球员:["someplayerId", "someotherPlayerId"]
在服务器上我有出版物目前正与它下面server/publications.js
:
Meteor.publish('players', function() {
return Players.find({});
});
Meteor.publish('teams', function() {
return Teams.find({}, {transform: function(doc) {
var playerOne = Players.findOne({ _id: doc.players[0]._id });
var playerTwo = Players.findOne({ _id: doc.players[1]._id });
doc.playerOne = playerOne;
doc.playerTwo = playerTwo;
return doc;
}
});
});
在我client/routes.js
我订阅我的国家之一,这些出版物,这样我可以在我的客户端代码中使用它们:
.state('tab.settings', {
url: '/settings',
views: {
'tab-settings': {
templateUrl: 'client/templates/settings.html',
controller: 'SettingsCtrl as settings',
resolve: {
teams() {
return Meteor.subscribe('teams');
},
players() {
return Meteor.subscribe('players');
}
}
}
}
});
现在我想用的球队在我的代码,但无论我做什么我似乎错过在得到这种化合物的数据点
这将返回一个错误,因为变量playerOne和playerTwo是不确定的:
this.helpers({
players:() => {
return Players.find({});
},
teams:() => {
return Teams.find({}, {transform: function(doc) {
var playerOne = Players.findOne({ _id: doc.players[0] });
var playerTwo = Players.findOne({ _id: doc.players[1] });
doc.playerOne = playerOne.name;
doc.playerTwo = playerTwo.name;
return doc;
}
});
}
});
在我的模板01
某处我想要使用团队,并将其转换为文档。如何才能做到这一点?
答
好的,回答我自己的问题,我做了以下这似乎按预期工作。服务器端我做了以下出版物:
Meteor.publish("players", function() {
return Players.find({});
});
Meteor.publish("teams", function() {
return Teams.find({});
});
路由器负责为所有子路径的所有订阅的下tabs
:
$stateProvider
.state('tab', {
url: '/tab',
abstract: true,
templateUrl: 'client/templates/tabs.html',
resolve: {
players() {
return Meteor.subscribe('players');
},
teams() {
return Meteor.subscribe('teams');
}
}
})
这导致在相同的“逻辑”,当涉及到客户端数据autopublish包会做,但现在没关系。
客户端现在我可以这样做:
this.helpers({
data:() => {
return Teams.find({}, {transform: function(doc) {
doc.playerOne = Players.findOne({ _id: doc.players[0]._id });
doc.playerTwo = Players.findOne({ _id: doc.players[1]._id });
return doc;
}
});
}
});
在我的模板中使用data
:
<ion-item ng-repeat="team in teams.data">
{{ team.players[0] | player_name }} and {{ team.players[1] | player_name }}
</ion-item>
player_name
是一个简单的角度滤波:
angular
.module('PLeague')
.filter('player_name', player_name);
function player_name() {
return function (player) {
if (!player) return;
return player.name;
};
}
,改变了事情从我的问题代码是团队收集和出版物客户端代码处理球队的方式,即findOne
获得球员[x] ._ id。
也许这是缺失的环节。
答
很可能,您的订阅还没有准备好。相反,我建议您使用模板级代码来呈现团队,然后渲染团队中的每个玩家。因此,在您的出版物:
Meteor.publish('teams', function() {
return Teams.find({}, {
transform: function (team) {
// this will give you access to all the players on this team.
team.players = Players.find({
_id: { $in: team.players }
}).map(player => player.name);
return team;
}
});
});
现在,该文件将是这样的:
{
_id: '1234',
players: ['Jeff', 'Tim', 'Steve']
}
那么你的模板中,你可以做以下。
{{#if Template.subscriptionsReady}}
{{#each teams}}
// now since the team has a player array, you can use that.
{{#each players}}
{{this}}
{{/each}}
{{/each}}
{{/if}}
感谢您的澄清。在angular-meteor包中是否有'subscriptionsReady'等价物? – tuvokki
好的,再次回答我自己的问题...在angular-meteor包中有一个'subscriptionsReady'等价物,用于订阅:'this.subscribe('publication',[args],{onReady:function( )...等等 – tuvokki