我在基本的流星应用程序中看到了意外的行为,这导致了我想提出意见的设计模式问题。
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();
}
}
});
};
答案 0 :(得分:0)
架构看起来很好,只需使用模板订阅并将模板包装在#subscriptionsReady助手中。这样做,渲染的回调不会运行,直到所有文档都在那里。
一般来说,图形网络真的非常快,大约10000个文档订阅后会明显变慢。如果你的数据并不需要反应,那么消除它(发布一个获取,而不是观察)会给你一个严重的速度提升。