Meteor - 在发布时更改数据
Meteor - alter data on publish
我正在 Meteor 中做纸牌游戏。每个玩过的游戏都注册在集合 "Games" 中。
游戏的记录包含一些游戏信息以及一些玩家信息和玩家的手牌(players[i].cards
,值如 4S
- 4 of spade,KH
- king心...)。根据卡片的价值,我可以向前端显示正确的卡片 (div.card-KH
)。
大部分游戏数据是public,当然,只有当前玩家的牌必须是可见的。
一种选择是在发布时排除其他玩家的牌,但我仍然需要牌的数量来显示其他玩家的套牌(只有剩余的牌,隐藏的)。
有没有办法将 players[i].cards
中每张牌(用户的除外)的牌值替换为 BACK
(div.card-BACK
) 在发布时?否则,在 Meteor 中执行此操作的好的设计模式是什么?
我认为应该有官方指南的有趣问题。
他们在文档中有一些关于发布的内容:
http://docs.meteor.com/#/full/meteor_publish(secretinfo 字段仅发布给管理员)
你可以这样做,但你必须检查 userId 并拥有 player1secretinfo、player2secretinfo 等(或者可能是 secretinfo array/object 但你只需要发布一个特定的 index/property)
您还可以在出版物中进行转换:
https://www.eventedmind.com/items/meteor-transforming-collection-documents
请post吧,如果你找到好的解决办法:)
这是我找到的唯一解决方案(我不太喜欢它,但它有效):
基本上,您必须将具有相同 ID 但已修改数据的临时文档存储到另一个集合,从该集合发布该文档,最后从客户端订阅该发布。
当然,切勿通过其他出版物公开原始文档的隐藏部分。
Meteor.publish('gameWithHiddenCards', function (gameId) {
var self = this;
//Transform function
var transform = function(item) {
for (var i=0; i<item.players.length; i++){
if ((item.players[i].id != self.userId))
for (var j = 0; j < item.players[i].cards.length; j++)
item.players[i].cards[j] = 'back';
return item;
};
/* 1. Observe changes in game ;
2. Apply transform function on game data ;
3. Store it to another Collection. */
var observer = Games.find({_id: gameId}).observe({
added: function (document) {
self.added('secure_games', document._id, transform(document));
},
changed: function (newDocument, oldDocument) {
self.changed('secure_games', newDocument._id, transform(newDocument));
},
removed: function (oldDocument) {
self.removed('secure_games', oldDocument._id);
}
});
self.onStop(function () {
observer.stop();
});
// Return altered game
return SecureGames.find({_id: gameId});
});
我正在 Meteor 中做纸牌游戏。每个玩过的游戏都注册在集合 "Games" 中。
游戏的记录包含一些游戏信息以及一些玩家信息和玩家的手牌(players[i].cards
,值如 4S
- 4 of spade,KH
- king心...)。根据卡片的价值,我可以向前端显示正确的卡片 (div.card-KH
)。
大部分游戏数据是public,当然,只有当前玩家的牌必须是可见的。
一种选择是在发布时排除其他玩家的牌,但我仍然需要牌的数量来显示其他玩家的套牌(只有剩余的牌,隐藏的)。
有没有办法将 players[i].cards
中每张牌(用户的除外)的牌值替换为 BACK
(div.card-BACK
) 在发布时?否则,在 Meteor 中执行此操作的好的设计模式是什么?
我认为应该有官方指南的有趣问题。
他们在文档中有一些关于发布的内容: http://docs.meteor.com/#/full/meteor_publish(secretinfo 字段仅发布给管理员) 你可以这样做,但你必须检查 userId 并拥有 player1secretinfo、player2secretinfo 等(或者可能是 secretinfo array/object 但你只需要发布一个特定的 index/property)
您还可以在出版物中进行转换: https://www.eventedmind.com/items/meteor-transforming-collection-documents
请post吧,如果你找到好的解决办法:)
这是我找到的唯一解决方案(我不太喜欢它,但它有效):
基本上,您必须将具有相同 ID 但已修改数据的临时文档存储到另一个集合,从该集合发布该文档,最后从客户端订阅该发布。 当然,切勿通过其他出版物公开原始文档的隐藏部分。
Meteor.publish('gameWithHiddenCards', function (gameId) {
var self = this;
//Transform function
var transform = function(item) {
for (var i=0; i<item.players.length; i++){
if ((item.players[i].id != self.userId))
for (var j = 0; j < item.players[i].cards.length; j++)
item.players[i].cards[j] = 'back';
return item;
};
/* 1. Observe changes in game ;
2. Apply transform function on game data ;
3. Store it to another Collection. */
var observer = Games.find({_id: gameId}).observe({
added: function (document) {
self.added('secure_games', document._id, transform(document));
},
changed: function (newDocument, oldDocument) {
self.changed('secure_games', newDocument._id, transform(newDocument));
},
removed: function (oldDocument) {
self.removed('secure_games', oldDocument._id);
}
});
self.onStop(function () {
observer.stop();
});
// Return altered game
return SecureGames.find({_id: gameId});
});