【问题标题】:Client-side-only reactivity with Meteor?与 Meteor 的仅客户端反应?
【发布时间】:2012-12-05 11:33:34
【问题描述】:

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

常见:

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>

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

我也不完全确定这是否是我应该做的,我一开始只是使用 jQuery 来隐藏未选择的任务,但我的头是流星,使用数据和反应性似乎很自然驱动选择/本地过滤。

有什么办法可以避免往返还是我用错了?

【问题讨论】:

    标签: meteor


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的澄清,这是我所期望的,但似乎很难预测,因为有时没有网络活动,但有时有。也许在处理同步时它有点随机。干杯:)
    • 这就是你看到ddp packets in realtime的方式
    猜你喜欢
    • 2013-11-01
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 2018-01-14
    • 2016-06-08
    • 2013-06-08
    相关资源
    最近更新 更多