多个流星集合的插入顺序

时间:2015-06-23 16:33:22

标签: meteor ddp

我在基本的流星应用程序中看到了意外的行为,这导致了我想提出意见的设计模式问题。

meteor app有一个服务器,它从外部源读取图形节点和边缘列表,将节点插入节点集合,将边缘插入边缘集合,然后将特殊文档插入第三个Signal集合。客户在所有三个集合上“添加:”观察者以检测变化。

我预计在绘制信号命令之前,客户端上会看到所有节点和链接。相反,我看到在客户端上的信号命令之后添加了大约1/3的节点和边缘。

我想避免绘制图形,直到所有数据都存在,因此使用Signal集合。在Meteor中有更好的方法吗?我应该使用不同的设计模式吗?这似乎应该是一个常见的问题。

// server side inserts
_.each(model.nodes, function(r) {
    Nodes.insert({ name: r.name });
});
_.each(model.edges, function(r) {
    Edges.insert({ source: r.src, target: r.tgt, value: r.value });
});
Signal.remove({});
Signal.insert({command: "draw-graph"});


// client side observer
Template.template_mission_impact.rendered = function () {
    var graph = new myGraph(...);

    Nodes.find().observe({
        added: function (doc) {
            graph.addNode(doc._id, doc.name);
        }
    });
    Edges.find().observe({
        added: function (doc) {
            graph.addEdge(doc._id, doc.source, doc.target, doc.value);
        }
    });
    Signal.find().observe({
        added: function (doc) {
            if (doc.command === "draw-graph") {
                graph.draw();
            }
        }
    });
};

1 个答案:

答案 0 :(得分:0)

架构看起来很好,只需使用模板订阅并将模板包装在#subscriptionsReady助手中。这样做,渲染的回调不会运行,直到所有文档都在那里。

一般来说,图形网络真的非常快,大约10000个文档订阅后会明显变慢。如果你的数据并不需要反应,那么消除它(发布一个获取,而不是观察)会给你一个严重的速度提升。