find
Metoda zwraca kursor, a nie obiekt ani tablicę. Aby uzyskać dostęp do obiektu, musisz albo pobrać go z kursora
var skill = Skills.find(Session.get('selected_skill')).fetch()[0];
lub uzyskaj go bezpośrednio za pomocą findOne
:
var skill = Skills.findOne(Session.get('selected_skill'));
Następnie możesz go używać tak jak każdego innego obiektu js:
console.log(skill.mana);
skill._cache = {cooldown: true};
Pamiętaj, że po stronie klienta metody zbierania, takie jak find
są nieblokujące. Zwracają to, co Meteor ma w pamięci podręcznej, niekoniecznie to, co znajduje się w bazie danych po stronie serwera. Dlatego zawsze powinieneś używać ich w kontekście reaktywnym lub upewnić się, że wszystkie dane zostały pobrane przed wykonaniem (nie martw się o to drugie, dopóki nie opanujesz biegle Meteor, zacznij od pierwszego sposobu).
Musisz także pamiętać, że z tego powodu findOne
i find.fetch
może zwrócić null
/ pusta tablica, nawet jeśli odpowiedni element znajduje się w db (ale nie został jeszcze zbuforowany). Jeśli nie weźmiesz tego pod uwagę w swoich funkcjach reaktywnych, napotkasz błędy.
Template.article.slug = function() {
var article = Articles.findOne(current_article);
if(!article) return '';
return slugify(article.title);
};
Jeśli nie uciekliśmy z funkcji za pomocą if(!article)
, wyrażenie article.title
zgłosi błąd w pierwszym obliczeniu, ponieważ article
byłby niezdefiniowany (zakładając, że nie był wcześniej buforowany).
Gdy chcesz zaktualizować bazę danych po stronie klienta, możesz zmienić tylko jeden element na raz i musisz odwoływać się do elementu przez jego _id
. Wynika to ze względów bezpieczeństwa. Twoja linia była w porządku:
Skills.update(Session.get('selected_skill'), {$inc: {mana: 1}});
alert()
to funkcja, która zwraca nieokreślone, bez względu na to, czym go karmisz.
alert(42); // -> undefined
Ogólnie jest daleko lepiej debugować za pomocą console.log
niż z alert
.