0

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

流星应用程序有一个服务器,它从外部源读取图形节点和边的列表,将节点插入到 Nodes 集合中,将边插入到 Edges 集合中,然后将特殊文档插入到第三个 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();
            }
        }
    });
};
4

1 回答 1

0

架构看起来不错,只需使用模板订阅并将模板包装在 #subscriptionsReady 帮助器中。这样做时,呈现的回调将在所有文档都存在之前不会运行。

一般来说,图网络变得非常大非常快,并且在大约 10000 个文档订阅之后会明显变慢。如果您的数据不需要反应性,那么消除它(发布获取,而不是观察)可以大大提高速度。

于 2015-06-23T17:05:54.673 回答