2016-01-22 180 views
1

我使用this tutorial來構建我自己的離子/流星/角度應用程序,並且我達到了刪除自動發佈和不安全的程度,進入發佈和訂閱我的數據的程度。流星中的化合物集合

我有我的流星應用的兩個蒙戈集合在lib/collections.js:現在我用下面的掙扎

Players = new Mongo.Collection('players'); 
Teams = new Mongo.Collection('teams'); 

玩家有一個_idname,一支球隊有一個_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

某處我想要使用團隊,並將其轉換爲文檔。如何才能做到這一點?

回答

0

好的,回答我自己的問題,我做了以下這似乎按預期工作。服務器端我做了以下出版物:

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。

也許這是缺失的環節。

0

很可能,您的訂閱還沒有準備好。相反,我建議您使用模板級代碼來呈現團隊,然後渲染團隊中的每個玩家。因此,在您的出版物:

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}} 
+0

感謝您的澄清。在angular-meteor包中是否有'subscriptionsReady'等價物? – tuvokki

+0

好的,再次回答我自己的問題...在angular-meteor包中有一個'subscriptionsReady'等價物,用於訂閱:'this.subscribe('publication',[args],{onReady:function( )...等等 – tuvokki