1

所以我有这个:

Template.cards.cards = function () {
  var deck = Deck.findOne({active: 1});
  var cards = Cards.find({deck_id: deck['_id']}).fetch();
  return cards;
}

但是“deck”返回未定义,即使从浏览器控制台调用相同的查询返回结果。

我觉得这是一个反应性问题,而我实现这一目标的方式存在根本性的问题。这感觉像是一种非常关系性的处理方式,我也是非关系数据存储的新手。我觉得我的处理方式可能存在根本性的问题,但我是 Meteor 的新手,我浏览了文档,但找不到我可能出错的地方。任何帮助是极大的赞赏。

4

2 回答 2

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 而不仅仅是一个活动标志。

希望这可以帮助。

于 2013-01-10T15:15:09.983 回答
0

[1]首先,检查active您传递的数据类型。如果它是一个字符串,那么{active: 1}将导致false并且查询将不返回任何结果。并且deck将继续存在undefined

[2]尝试findOneas 的替代方式:Deck.find({active: 1}).fetch()[0];这将返回与Deck.findOne({active: 1});

[3]findOne() andfind().fetch()[0]返回具有属性的对象,引用对象属性的有效方式是objectName.propertyName,所以替换deck['_id']deck._idinCards.find({deck_id: deck['_id']}).fetch();

于 2013-01-10T08:07:45.403 回答