12

一般的な質問: 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 はそのコレクションをサブスクライブします。)

上記のコードは機能しているように見えますが、どういうわけか私には正しく見えません。質問:

  1. このように Lists コレクションを観察するのは合理的な方法ですか? 非効率的である可能性があるようです.Listsドキュメントに変更を加えると、このコードがトリガーされます.
  2. クライアント側で別の (シミュレートされた) 更新を行うべきですか、それとも同じ Mongo/Minimongo 更新を両方で実行しても問題ありませんか?
  3. listsObserver.stop()オブザーバーを破棄するために、ある時点で呼び出す必要がありますか? もしそうなら、いつですか?

(私は Meteor を使い始めたばかりなので、他の環境からの私のバイアスが漏れている可能性があります。ここで暗に示されているメタ質問は、この問題について正しい方法で考えているかどうかです。)

4

3 に答える 3

1

サーバーコードでも同様のことをしました。基本的に、このコードを Meteor.methods() に配置し、Lists コレクションに加えたいその他のチェックと更新を行います。

以下のコードは少し乱雑に見えますが、var slug で始まる行を理解するのは確かに困難です。

Meteor.methods({
   myupdate: function (doc) {

     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}});
     }
   }
});
于 2013-12-19T18:02:33.743 に答える
0

これを実装する 1 つの方法は、カスタム テンプレート関数を定義し、変更中のテンプレートでそれをトリガーすることです。例えば:

client.js 内

Template.myTemplate.custom_function_to_update = function() {
    // do my update code.  i.e. MyCollections.Update(...);
}

テンプレートを含むhtmlファイルで

<template name="myTemplate">
    <!-- Normal template code -->
    {{ custom_function_to_update }}
</template>

テンプレート「myTemplate」が更新されるたびに、メソッドが呼び出されます。

于 2012-09-21T21:14:21.700 に答える