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() ,而无需服务器往返。如果您看到网络活动或对服务器代码的调用,那是因为流星定期在幕后工作以保持订阅与服务器同步,而不是为了您的特定发现。

这也意味着您必须警惕向客户端发送过多数据,因此您的服务器端发布功能可能希望通过客户端所需的特定字段进行过滤,除了现有的选择标准。

于 2012-12-21T09:30:41.857 回答