一般的な質問: Meteor で、モデルが更新されるたびにトリガーされるビジネス ロジックを実装する最良の方法は何ですか?
具体例: Meteor todos exampleの Lists コレクションに「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 を使い始めたばかりなので、他の環境からの私のバイアスが漏れている可能性があります。ここで暗に示されているメタ質問は、この問題について正しい方法で考えているかどうかです。)