find
Die Methode gibt einen Cursor zurück, weder ein Objekt noch ein Array. Um auf das Objekt zuzugreifen, müssen Sie es entweder vom Cursor holen
var skill = Skills.find(Session.get('selected_skill')).fetch()[0];
oder direkt mit findOne
abrufen :
var skill = Skills.findOne(Session.get('selected_skill'));
Dann können Sie es wie jedes andere js-Objekt verwenden:
console.log(skill.mana);
skill._cache = {cooldown: true};
Denken Sie daran, dass auf Clientseite Sammelmethoden wie find
sind nicht blockierend. Sie geben das zurück, was Meteor im Cache hat, nicht unbedingt das, was sich in der serverseitigen Datenbank befindet. Aus diesem Grund sollten Sie sie immer in einem reaktiven Kontext verwenden oder sicherstellen, dass alle Daten vor der Ausführung abgerufen wurden (machen Sie sich um letzteres keine Sorgen, bis Sie Meteor fließend beherrschen, beginnen Sie mit dem ersten Weg).
Außerdem müssen Sie daran denken, dass aus diesem Grund findOne
und find.fetch
kann null
zurückgeben / leeres Array, auch wenn das entsprechende Element in db ist (aber noch nicht zwischengespeichert wurde). Wenn Sie das in Ihren reaktiven Funktionen nicht berücksichtigen, werden Sie auf Fehler stoßen.
Template.article.slug = function() {
var article = Articles.findOne(current_article);
if(!article) return '';
return slugify(article.title);
};
Wenn wir die Funktion nicht mit if(!article)
verlassen haben , der Ausdruck article.title
würde bei der ersten Berechnung einen Fehler auslösen, da article
wäre undefiniert (vorausgesetzt, es wurde nicht früher zwischengespeichert).
Wenn Sie die Datenbank von der Client-Seite aktualisieren möchten, können Sie jeweils nur ein Element ändern, und Sie müssen auf das Element anhand seiner _id
verweisen . Dies hat Sicherheitsgründe. Deine Zeile dafür war ok:
Skills.update(Session.get('selected_skill'), {$inc: {mana: 1}});
alert()
ist eine Funktion, die zurückgibt undefiniert, egal was du fütterst.
alert(42); // -> undefined
Im Allgemeinen ist es weit besser mit console.log
debuggen als mit alert
.