find
方法返回一个游标,而不是对象或数组。要访问对象,您需要从游标中获取它
var skill = Skills.find(Session.get('selected_skill')).fetch()[0];
或直接使用findOne
:
var skill = Skills.findOne(Session.get('selected_skill'));
然后你可以像使用任何其他 js 对象一样使用它:
console.log(skill.mana);
skill._cache = {cooldown: true};
请记住,在客户端,诸如此类的收集方法find
是非阻塞的。它们返回 Meteor 缓存中的任何内容,不一定是服务器端数据库中的内容。这就是为什么您应该始终在反应式上下文中使用它们,或者确保在执行之前已获取所有数据(在您熟练使用 Meteor 之前不要担心后者,从第一种方式开始)。
此外,您需要记住,因此,即使相应的元素在 db 中(但尚未缓存) ,findOne
也find.fetch
可能返回/ 空数组。null
如果你在反应函数中没有考虑到这一点,你会遇到错误。
Template.article.slug = function() {
var article = Articles.findOne(current_article);
if(!article) return '';
return slugify(article.title);
};
如果我们没有从函数中转义if(!article)
,则表达式article.title
将在第一次计算中引发错误,就像article
未定义的那样(假设它之前没有被缓存)。
当您想从客户端更新数据库时,您一次只能更改一个项目,并且您必须通过其引用该项目_id
。这是出于安全原因。你的这行没问题:
Skills.update(Session.get('selected_skill'), {$inc: {mana: 1}});
alert()
是一个无论你提供什么都返回undefined的函数。
alert(42); // -> undefined
一般来说,用 调试要比用调试好得多。console.log
alert