【发布时间】:2012-09-17 17:38:07
【问题描述】:
一般问题:在 Meteor 中,实现在模型更新时触发的业务逻辑的最佳方式是什么——例如,用于更新依赖字段或验证或...
具体示例:我想在Meteor todos example 的Lists 集合中添加一个“slug”字段。每当列表名称更改时,slug 都需要自动更新。
这就是我所拥有的...我正在观察 每一个 对列表的更改,以查看是否需要创建/更新其 slug。这是在 shared 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,所以也许我对其他环境的偏见正在泄漏。这里隐含的元问题是,我是否以正确的方式思考这个问题?)
【问题讨论】:
-
嗯...刚刚在有关 Meteor 数据验证的旧问题中找到 this comment。好像说你应该实现 RPC 风格的 Meteor.methods 进行模型编辑,然后阻止客户端的 minimongo 模型自动同步回服务器。 (希望这不是建议。自动、实时、双向同步是 Meteor 的一大吸引力。)
标签: meteor