一般问题:在 Meteor 中,实现在模型更新时触发的业务逻辑的最佳方式是什么——例如,用于更新依赖字段或验证或......
具体示例:我想在Meteor todos 示例中的 Lists 集合中添加一个“slug”字段。每当列表的名称更改时,slug 需要自动更新。
这就是我所拥有的......我正在观察列表的每一个变化,看看是否需要创建/更新它的 slug。这是在共享的models.js 中(运行服务器和客户端,以获得延迟补偿的好处):
// Lists -- {name: String}
Lists = new Meteor.Collection("lists");
var listsObserver = Lists.find().observe({
added: updateSlug,
changed: updateSlug
});
function updateSlug(doc, idx) {
var slug = (doc.name || '').replace(/\W+/g, '-').toLowerCase();
if (slug !== doc.slug) {
console.log("Updating slug for '" + doc.name + "' to " + slug);
Lists.update(doc._id, {$set: {slug: slug}});
}
}
(就像在原始的 todos 示例中一样,server/publish.js 将所有内容发布Lists.find()
为“列表”,而 client/todos.js 订阅该集合。)
上面的代码似乎可以工作,但对我来说似乎不太合适。问题:
- 像这样观察 Lists 集合是一种合理的方法吗?看起来它可能效率低下——对 Lists 文档的任何更改都会触发此代码。
- 我应该在客户端进行不同的(模拟的)更新,还是让相同的 Mongo/Minimongo 更新在两者上运行?
- 我是否需要
listsObserver.stop()
在某个时候打电话来处置观察者?如果是这样,什么时候?
(我刚刚开始使用 Meteor,所以也许我对其他环境的偏见正在泄漏。这里隐含的元问题是,我是否以正确的方式思考这个问题?)