find
il metodo restituisce un cursore, non un oggetto né un array. Per accedere all'oggetto, devi recuperarlo dal cursore
var skill = Skills.find(Session.get('selected_skill')).fetch()[0];
oppure scaricalo direttamente con findOne
:
var skill = Skills.findOne(Session.get('selected_skill'));
Quindi puoi usarlo come qualsiasi altro oggetto js:
console.log(skill.mana);
skill._cache = {cooldown: true};
Tieni presente che sul lato client, metodi di raccolta come find
sono non bloccanti. Restituiscono tutto ciò che Meteor ha nella cache, non necessariamente ciò che è nel db lato server. Ecco perché dovresti sempre usarli in un contesto reattivo, o assicurarti che tutti i dati siano stati recuperati prima dell'esecuzione (non preoccuparti di quest'ultimo fino a quando non sarai fluente con Meteor, inizia con il primo modo).
Inoltre, devi tenere presente che per questo motivo findOne
e find.fetch
può restituire null
/ array vuoto, anche quando l'elemento corrispondente è in db (ma non è stato ancora memorizzato nella cache). Se non lo prendi in considerazione nelle tue funzioni reattive, ti imbatterai in errori.
Template.article.slug = function() {
var article = Articles.findOne(current_article);
if(!article) return '';
return slugify(article.title);
};
Se non siamo scappati dalla funzione con if(!article)
, l'espressione article.title
genererebbe un errore nel primo calcolo, come article
sarebbe indefinito (supponendo che non sia stato memorizzato nella cache in precedenza).
Quando vuoi aggiornare il database dal lato client, puoi modificare solo un elemento alla volta e devi fare riferimento all'elemento tramite il suo _id
. Ciò è dovuto a motivi di sicurezza. La tua linea per questo era ok:
Skills.update(Session.get('selected_skill'), {$inc: {mana: 1}});
alert()
è una funzione che restituisce indefinito, non importa cosa gli dai da mangiare.
alert(42); // -> undefined
In genere è lontano meglio eseguire il debug con console.log
che con alert
.