我建的应用程序有一个游戏集合。该集合中的每个对象都有大量与之相关的数据。在为每个用户列出游戏时,我必须限制我发送给它的字段。这是所有常见的东西,工作正常。当我想要获得特定游戏的更多字段时,问题就出现了,比如当我访问它的页面时,我需要的不仅仅是描述和名称。
下面是游戏列表的发布,然后是我试图用来更新包含所有字段的文档的发布。
Meteor.publish('games', function() {
return Games.find({owner: this.userId}, {fields: {
name: 1,
description: 1
}});
});
//Publish all the fields for the given game
Meteor.publish('game', function(gameId) {
return Games.find({_id: gameId});
});
我对Meteor中的发布订阅功能的理解是第二次发布会更新Games minimongo集合,将新字段提供给集合中的对象。
然而,我的理解似乎有缺陷,或者我的实施有些不对劲。
当我在列表页面上记录游戏集console.log(Games)
时,我订阅了游戏'发布。我得到了我所期望的,一个包含当前用户拥有的所有游戏的集合。所有文件只有预期的名称和描述。
当我进入游戏页面时,我订阅了游戏'。该集合意外地改变了。当我执行与上面相同的日志时,我得到的集合只有一个对象,但包含所有字段。这不是我的预期,但它适用于我需要的东西。
问题出现在此之后。当我在客户端选择minimongo colleciton时(下方)。我得到的对象只有描述和名称。
game: () => {
return Games.findOne({_id: $stateParams.gameId});
}
我在一个拥有一个包含我想要的所有字段的对象的colleciton上进行查找,但select返回的对象只有我事先定义的两个字段。
我迷失了如何让这个工作,并且我遇到的问题让我对Meteor中的发布订阅功能的了解超出了窗口。
如果需要,我可以在浏览器控制台中添加一些集合对象的截图
要尝试的任何想法或建议吗?
编辑:以下是我的角色竞争的两个要点,显示订阅:
答案 0 :(得分:1)
你描述这种行为的方式对我来说似乎很正常:你订阅了一个包含所有项目的集合,另一方面你订阅了一个子集,所以Meteor'magic'在这里对你不利。
您可以做几件事:
只在一个游戏的页面上订阅BOTH订阅:这将阻止清除整个列表,因为您没有订阅它,它只会更新一个游戏及其所有字段。
将收藏品拆分为信息和通用选项:我觉得这对你来说更麻烦,但是可以选择。
做一个方法调用来获取一个游戏的信息:有点hacky但应该有效。
我认为你应该尝试第一个选项,看看它是如何表现的。在任何情况下,如果它是一个需要时间加载的长列表,你应该确保你保持订阅完整的集合。
祝你好运。