1

ウィンドウにメッセージを追加し続けていますが、最後の 10 件のメッセージだけを表示したいと考えています。どうすればいいのですか?jQueryでは、リストに追加して削除するだけですが、Meteorではこのようなものがあります。

htmlで

<template name="messages">
    {{#each messages}}
       <strong>{{name}}</strong> : {{message}}<br>
    {{/each}}
</template>

メッセージをループしているため、アプリにすべてのメッセージが表示されます。次に、全体をループするのではなく、10個だけを選択するにはどうすればよいですか。ありがとう!

 Template.messages.messages = function () {
     return Messages.find({}, { sort: { time: -1 }});
 }

 Template.input_box.events = {
     "keydown input#message" : function(event){
         if (event.which == 13) { 
        if (Meteor.user())
        {
            var name = Meteor.user().profile.name;
        }
        else
        {
            var name = "Anonymous";
        }

        var message = document.getElementById("message");

        var thetime = new Date();
        var time_string = "time "+thetime.getHours();
        if (message.value != "") {
            Messages.insert({
                name: name,
                message: message.value,
                time: time_string,
            });

            document.getElementById("message").value = "";
            message.value = "";
        }
    }
   }

}

4

1 に答える 1

1

メッセージを表示しない場合は、さらに進んで、クライアントのミニモンゴからメッセージを完全に削除します。そうしないと、使用していないキャッシュがいっぱいになり、マージ ボックスが汚染されます。次のパブリケーションはすべてのメッセージを作成しますが、最後の 10 件はクライアントで自動的に消えます。

Meteor.publish("messages", function() {
    return Messages.find({}, {
        sort: { time: -1 },
        limit: 10
    });
});

いくつかのメモ:

  • クライアントのタイムスタンプは信頼できず、メッセージは必ずしも送信された順序で表示されるとは限らないため、サーバーでタイムスタンプを計算する必要があります。deny フックを追加するか、collection-hooks を使用します。
  • メッセージを最新のものから順に表示する場合を除き、クライアント上でタイムスタンプの昇順でメッセージを再度並べ替える必要がある場合があります。
  • サーバーが最新の 10 件のメッセージを効率的に追跡できるように、Mongo コレクション(特にフィールド) に適切なインデックスがあることを確認してください。time

    Messages._ensureIndex({time: 1});
    

    さらに、使用しているその他のフィールド。複合インデックスを使用している場合は、適切な順序についてhttp://docs.mongodb.org/manual/core/indexes/を参照してください。

于 2013-09-19T16:36:15.917 に答える