客户端与Meteor的唯一反应?

Bob*_*ies 9 meteor

我在服务器上发布了一个集合,并在客户端上自动订阅.我想在会话中设置'selected'项目并让模板更新以仅显示所选项目,但似乎只能通过往返服务器来完成(这是完全没必要的).

共同:

var Missions = new Meteor.Collection('missions');
Run Code Online (Sandbox Code Playgroud)

客户:

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");
});
Run Code Online (Sandbox Code Playgroud)

服务器:

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

模板:

<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>
Run Code Online (Sandbox Code Playgroud)

我的要求是Missions.find()in Template.missionList.missions来过滤客户端缓存的结果,而不是从服务器重新请求,但我似乎无法找到一个标志或设置,以允许我告诉minimongo只使用当前可用的数据.

我也不完全确定这是否是我应该做的事情,我开始只是使用jQuery隐藏未选择的任务,但让我的头围绕Meteor,似乎很自然地使用数据和反应来驱动选择/本地的过滤.

有没有办法可以避免往返,或者我只是错误使用它?

Dav*_*ihl 4

通过设置发布/订阅关系,您正在创建一种简化形式的数据库复制。Minimongo 将在本地拥有数据的副本并在本地执行 find() ,而无需服务器往返。如果您看到网络活动或对服务器代码的调用,那是因为 Meteor 定期在幕后工作以保持订阅与服务器同步,而不是为了您的特定查找。

这也意味着您必须小心不要向客户端发送太多数据,因此除了现有的选择标准之外,您的服务器端发布功能可能还需要按客户端所需的特定字段进行过滤。