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]次の別の方法を試してくださいfindOneDeck.find({active: 1}).fetch()[0];これは、と同じ結果を返しますDeck.findOne({active: 1});

[3]findOne() andは、プロパティを持ち、オブジェクトのプロパティを参照する有効な方法を持つオブジェクトをfind().fetch()[0]返します。したがって、次のように置き換えます。objectName.propertyNamedeck['_id']deck._idCards.find({deck_id: deck['_id']}).fetch();

于 2013-01-10T08:07:45.403 に答える