我在一个基本的流星应用程序中看到了意外的行为,导致我想提出一个设计模式问题以征求意见。
流星应用程序有一个服务器,它从外部源读取图形节点和边的列表,将节点插入到 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();
}
}
});
};