9

サーバーで公開され、クライアントで自動サブスクライブされたコレクションがあります。セッションで「選択した」アイテムを設定し、選択したアイテムのみを表示するようにテンプレートを更新したいのですが、これはサーバーへのラウンドトリップでしか実行できないようです (これはまったく不要です)。

一般:

var Missions = new Meteor.Collection('missions');

クライアント:

Template.missionList.missions = function() {
    var currMission = Session.get('selectedMission');
    var searchMission = {};
    if(currMission)
    {
        searchMission['_id'] = currMission;
    }
    return Missions.find(searchMission);
};
Template.missionList.events({
    'click div.mission': function (e, t) {
        Session.set('selectedMission', 
            this._id == Session.get('selectedMission') ? null : this._id
        );
    }
});
Template.mission.isSelected = function() {
    return this._id == Session.get('selectedMission');
};
Meteor.autosubscribe(function () {
    Meteor.subscribe("missions");
});

サーバ:

Meteor.publish('missions', function() {
    // there are really some filters here, but removed for simplicity
    return Missions.find(); 
});

テンプレート:

<template name="missionList">
    <div class="missionList">
    {{#each missions}}
        {{> mission}}
    {{/each}}
    </div>
</template>

<template name="mission">
    <div class="mission{{#if isSelected}} selected{{/if}}">details</div>
</template>

私の要件は、サーバーから再要求するのMissions.find()Template.missionList.missionsはなく、クライアント側のキャッシュされた結果をフィルター処理することですが、現在利用可能なデータのみを使用するように minimongo に指示できるフラグや設定が見つからないようです。 .

これが私がすべきことかどうかも完全にはわかりません.jQueryを使用して選択されていないミッションを非表示にすることから始めましたが、Meteorに頭を悩ませました。 /ローカルフィルタリング。

往復を回避できる方法はありますか、それとも間違って使用していますか?

4

1 に答える 1

4

パブリッシュ/サブスクライブの関係を設定することにより、単純化された形式のデータベース レプリケーションを作成します。Minimongo はデータのコピーをローカルに保持し、サーバーとの往復なしでローカルで find() を実行します。ネットワーク アクティビティやサーバー コードの呼び出しが表示されている場合は、Meteor がバックグラウンドで定期的に動作して、サブスクリプションとサーバーとの同期を維持しているためであり、特定の発見のためではありません。

これは、クライアントに送信するデータが多すぎることに注意する必要があることも意味します。そのため、サーバー側の公開機能は、既存の選択基準に加えて、クライアントが必要とする特定のフィールドでフィルタリングする必要がある場合があります。

于 2012-12-21T09:30:41.857 に答える