find
metode returnerer en markør, ikke objekt eller matrix. For at få adgang til objektet skal du enten hente det fra markøren
var skill = Skills.find(Session.get('selected_skill')).fetch()[0];
eller få det direkte med findOne
:
var skill = Skills.findOne(Session.get('selected_skill'));
Så kan du bruge det ligesom ethvert andet js-objekt:
console.log(skill.mana);
skill._cache = {cooldown: true};
Husk, at på klientsiden er indsamlingsmetoder som find
er ikke-blokerende. De returnerer alt, hvad Meteor har i cachen, ikke nødvendigvis det, der er i server-side db. Derfor bør du altid bruge dem i en reaktiv kontekst eller sikre, at alle data er blevet hentet før udførelse (du skal ikke bekymre dig om sidstnævnte, før du er flydende med Meteor, start med den første måde).
Du skal også huske på, at på grund af dette, findOne
og find.fetch
kan returnere null
/ tomt array, selv når det tilsvarende element er i db (men endnu ikke er blevet cachelagret). Hvis du ikke tager højde for det i dine reaktive funktioner, vil du løbe ind i fejl.
Template.article.slug = function() {
var article = Articles.findOne(current_article);
if(!article) return '';
return slugify(article.title);
};
Hvis vi ikke flygtede fra funktionen med if(!article)
, udtrykket article.title
ville rejse en fejl i den første beregning, som article
ville være udefineret (forudsat at den ikke var cachelagret tidligere).
Når du vil opdatere databasen fra klientsiden, kan du kun ændre ét element ad gangen, og du skal henvise til elementet ved dets _id
. Dette skyldes sikkerhedsmæssige årsager. Din linje for dette var ok:
Skills.update(Session.get('selected_skill'), {$inc: {mana: 1}});
alert()
er en funktion, der returnerer udefineret, uanset hvad du fodrer den med.
alert(42); // -> undefined
Generelt er det langt bedre at fejlsøge med console.log
end med alert
.