find
メソッドは、オブジェクトや配列ではなく、カーソルを返します。オブジェクトにアクセスするには、カーソルからオブジェクトをフェッチする必要があります
var skill = Skills.find(Session.get('selected_skill')).fetch()[0];
または、findOne
で直接入手してください :
var skill = Skills.findOne(Session.get('selected_skill'));
次に、他のjsオブジェクトと同じように使用できます:
console.log(skill.mana);
skill._cache = {cooldown: true};
クライアント側では、find
などの収集メソッドがあることに注意してください。 ノンブロッキングです。 Meteorがキャッシュに持っているものは何でも返しますが、必ずしもサーバー側のデータベースにあるものではありません。そのため、常にリアクティブコンテキストで使用するか、実行前にすべてのデータがフェッチされていることを確認する必要があります(Meteorに精通するまでは、最初の方法から始めてください)。
また、このため、findOne
およびfind.fetch
null
を返す場合があります /対応する要素がdbにある場合でも、空の配列(ただし、まだキャッシュされていません)。リアクティブ関数でそれを考慮しないと、エラーが発生します。
Template.article.slug = function() {
var article = Articles.findOne(current_article);
if(!article) return '';
return slugify(article.title);
};
if(!article)
を使用して関数からエスケープしなかった場合 、式article.title
article
のように、最初の計算でエラーが発生します 未定義になります(以前にキャッシュされていなかったと仮定します)。
クライアント側からデータベースを更新する場合は、一度に1つのアイテムしか変更できず、そのアイテムを_id
で参照する必要があります。 。これはセキュリティ上の理由によるものです。これに対するあなたのラインは大丈夫でした:
Skills.update(Session.get('selected_skill'), {$inc: {mana: 1}});
alert()
戻る関数です 何を与えても未定義です。
alert(42); // -> undefined
一般的に、それは遠い console.log
でデバッグする方が良い alert
よりも 。