Meteor 在助手中查找订阅之前,如何确保订阅已准备就绪?
我希望做一些非常简单的事情,即将数据库中某个字段的值转换为助手中的变量。该文档如下所示:Meteor 在助手中查找订阅之前,如何确保订阅已准备就绪?,meteor,Meteor,我希望做一些非常简单的事情,即将数据库中某个字段的值转换为助手中的变量。该文档如下所示: { hero: "Simon Belmont", universe: "Castlevania", items: ["Whip", "Cross", "Oak Stake"] } 在helper中,我希望执行类似的操作: var selectedHeroId = Session.get('whichHeroSelected') var heroItems = Heroes.findOne({_
{
hero: "Simon Belmont",
universe: "Castlevania",
items: ["Whip", "Cross", "Oak Stake"]
}
在helper中,我希望执行类似的操作:
var selectedHeroId = Session.get('whichHeroSelected')
var heroItems = Heroes.findOne({_id: selectedHero}).items
然而,事实证明,这是非常变化无常的。有时它会抱怨项
未定义。奇怪的是,当我将变量命名为items
时,它就起作用了,但当我将变量命名为heroItems
或itemsArray
时,它就不起作用了
因此,我正在寻找一种方法,以确保在数据库中查找内容之前订阅了
Heroes
。顺便说一句,我在Iron Router的waitOn功能中订阅了它。听起来你只需要一个:
Template.myTemplate.helpers({
项目:功能(){
var selectedHero=heros.findOne(Session.get('whichHeroSelected');
返回selectedHero&&selectedHero.items;
}
});
不错,但有两件事:1)我不是马上返回数据,而是在之前处理数据。2) 根据这篇文章,waitOn
应该自动解决这个问题。为什么这里不是这样呢?第一件事很容易解决,当然,通过使herodems
函数返回与您所说相同的内容。这完全解决了我的问题,但我仍然好奇为什么waitOn
不起作用。它应该起作用,但我不能说为什么没有看到waitOn
代码。您是否在其中启动了多个订阅?如果是这样,您将需要返回一个数组(这是一个常见的问题)。我意识到这很可能是因为它们依赖于会话,而会话又依赖于DOM中的内容呈现。我对您的解决方案非常满意,并已开始使用它重写许多代码!:)听起来很复杂。当阻止渲染非常重要时,我建议使用waitOn
,因为渐进式更新在UI中没有意义。在所有其他情况下,我认为使用警卫更有意义。