find
metode mengembalikan kursor, bukan objek atau array. Untuk mengakses objek, Anda harus mengambilnya dari kursor
var skill = Skills.find(Session.get('selected_skill')).fetch()[0];
atau dapatkan langsung dengan findOne
:
var skill = Skills.findOne(Session.get('selected_skill'));
Kemudian Anda dapat menggunakannya sama seperti objek js lainnya:
console.log(skill.mana);
skill._cache = {cooldown: true};
Ingatlah bahwa di sisi klien, metode pengumpulan seperti find
adalah non-blocking. Mereka mengembalikan apa pun yang dimiliki Meteor dalam cache, belum tentu apa yang ada di db sisi server. Itulah mengapa Anda harus selalu menggunakannya dalam konteks reaktif, atau memastikan bahwa semua data telah diambil sebelum eksekusi (jangan khawatir tentang yang terakhir sampai Anda fasih dengan Meteor, mulailah dengan cara pertama).
Juga, Anda perlu mengingat bahwa karena ini, findOne
dan find.fetch
dapat mengembalikan null
/ array kosong, bahkan ketika elemen yang sesuai dalam db (tetapi belum di-cache). Jika Anda tidak memperhitungkannya dalam fungsi reaktif, Anda akan mengalami kesalahan.
Template.article.slug = function() {
var article = Articles.findOne(current_article);
if(!article) return '';
return slugify(article.title);
};
Jika kita tidak lolos dari fungsi dengan if(!article)
, ekspresi article.title
akan menimbulkan kesalahan dalam perhitungan pertama, seperti article
akan tidak terdefinisi (dengan asumsi itu tidak di-cache sebelumnya).
Saat Anda ingin memperbarui database dari sisi klien, Anda hanya dapat mengubah satu item per waktu, dan Anda harus merujuk ke item dengan _id
-nya . Ini karena alasan keamanan. Baris Anda untuk ini baik-baik saja:
Skills.update(Session.get('selected_skill'), {$inc: {mana: 1}});
alert()
adalah fungsi yang mengembalikan tidak ditentukan apa pun yang Anda berikan.
alert(42); // -> undefined
Secara umum, jaraknya jauh lebih baik untuk men-debug dengan console.log
dibandingkan dengan alert
.