所以我有这个:
Template.cards.cards = function () {
var deck = Deck.findOne({active: 1});
var cards = Cards.find({deck_id: deck['_id']}).fetch();
return cards;
}
但是“deck”返回undefined,即使从浏览器控制台调用相同的查询返回结果。
我觉得这是一个反应性问题,我实现这个目标的方式存在根本性的错误。感觉就像是一种非常关系的方式,我也是非关系数据存储的新手。我觉得我的方式可能会有一些根本性的错误,但我是Meteor的新手,我已经浏览了文档,但找不到我可能出错的地方。非常感谢任何帮助。
答案 0 :(得分:2)
如果您在启动时尝试立即访问Deck
订阅,则可能尚未加载数据。您可以使用subscribe
方法中的回调来确保您拥有数据:
Meteor.subscribe("deck", function () {
Session.set("activeDeck", 1);
};
Template.cards.cards = function () {
var deck = Deck.findOne({ active: Session.get("activeDeck") });
var cards = Cards.find({ deck_id: deck['_id'] }).fetch();
return cards;
};
也许您想要更改此选项以订阅decks
,然后在会话中存储套牌ID,而不仅仅是活动旗帜。
希望这有帮助。
答案 1 :(得分:0)
[1] 首先,检查您传递的active
数据类型。如果是字符串,那么{active: 1}
将导致false
,并且查询将不返回任何结果。 deck
将保持undefined
。
[2] 尝试findOne
的替代方式:Deck.find({active: 1}).fetch()[0];
这将返回与Deck.findOne({active: 1});
相同的结果
[3] findOne()
和find().fetch()[0]
返回具有属性的对象,并且引用对象属性的有效方式为{{ 1}},所以将objectName.propertyName
替换为deck['_id']
deck._id