find
metoda vrací kurzor, nikoli objekt ani pole. Pro přístup k objektu jej musíte buď načíst z kurzoru
var skill = Skills.find(Session.get('selected_skill')).fetch()[0];
nebo jej získejte přímo pomocí findOne
:
var skill = Skills.findOne(Session.get('selected_skill'));
Pak jej můžete použít stejně jako jakýkoli jiný objekt js:
console.log(skill.mana);
skill._cache = {cooldown: true};
Mějte na paměti, že na straně klienta se používají metody shromažďování, jako je find
jsou neblokující. Vracejí vše, co má Meteor v mezipaměti, ne nutně to, co je v databázi na straně serveru. Proto byste je měli vždy používat v reaktivním kontextu nebo se ujistit, že všechna data byla načtena před spuštěním (nedělejte si starosti s tím druhým, dokud nebudete ovládat Meteor, začněte prvním způsobem).
Také musíte mít na paměti, že kvůli tomu findOne
a find.fetch
může vrátit null
/ prázdné pole, i když je odpovídající prvek v db (ale ještě nebyl uložen do mezipaměti). Pokud to ve svých reaktivních funkcích nezohledníte, narazíte na chyby.
Template.article.slug = function() {
var article = Articles.findOne(current_article);
if(!article) return '';
return slugify(article.title);
};
Pokud jsme z funkce neunikli pomocí if(!article)
, výraz article.title
by vyvolalo chybu v prvním výpočtu, jako article
by byl nedefinovaný (za předpokladu, že nebyl dříve uložen do mezipaměti).
Když chcete aktualizovat databázi ze strany klienta, můžete změnit pouze jednu položku v čase a musíte na položku odkazovat pomocí jejího _id
. Je to z bezpečnostních důvodů. Vaše linka na to byla v pořádku:
Skills.update(Session.get('selected_skill'), {$inc: {mana: 1}});
alert()
je funkce, která vrací undefined bez ohledu na to, čím jej krmíte.
alert(42); // -> undefined
Obecně je to daleko lepší je ladit pomocí console.log
než u alert
.