find
metod returnerar en markör, inte objekt eller array. För att komma åt objektet måste du antingen hämta det från markören
var skill = Skills.find(Session.get('selected_skill')).fetch()[0];
eller få det direkt med findOne
:
var skill = Skills.findOne(Session.get('selected_skill'));
Sedan kan du använda det precis som vilket annat js-objekt som helst:
console.log(skill.mana);
skill._cache = {cooldown: true};
Tänk på att insamlingsmetoder som find
på klientsidan är icke-blockerande. De returnerar allt Meteor har i cachen, inte nödvändigtvis det som finns i serversidans db. Det är därför du alltid bör använda dem i ett reaktivt sammanhang, eller se till att all data har hämtats innan exekvering (oroa dig inte för det senare förrän du är flytande med Meteor, börja med det första sättet).
Du måste också komma ihåg att på grund av detta, findOne
och find.fetch
kan returnera null
/ tom array, även när motsvarande element är i db (men ännu inte har cachelagrats). Om du inte tar hänsyn till det i dina reaktiva funktioner kommer du att stöta på fel.
Template.article.slug = function() {
var article = Articles.findOne(current_article);
if(!article) return '';
return slugify(article.title);
};
Om vi inte flydde från funktionen med if(!article)
, uttrycket article.title
skulle skapa ett fel i den första beräkningen, som article
skulle vara odefinierad (förutsatt att den inte cachades tidigare).
När du vill uppdatera databasen från klientsidan kan du bara ändra ett objekt åt gången, och du måste referera till objektet med dess _id
. Detta på grund av säkerhetsskäl. Din linje för detta var ok:
Skills.update(Session.get('selected_skill'), {$inc: {mana: 1}});
alert()
är en funktion som returnerar odefinierat oavsett vad du matar den.
alert(42); // -> undefined
I allmänhet är det långt bättre att felsöka med console.log
än med alert
.