0

基本的な meteor アプリケーションで予期しない動作が見られ、コメントを求める設計パターンの質問につながります。

meteor アプリには、外部ソースからグラフ ノードとエッジのリストを読み取り、ノードを Nodes コレクションに挿入し、エッジを Edges コレクションに挿入し、特別なドキュメントを 3 番目の Signal コレクションに挿入するサーバーがあります。クライアントは、変更を検出するために、3 つのコレクションすべてに「追加:」オブザーバーを持っています。

信号コマンドを描画する前に、すべてのノードとリンクがクライアントに表示されることを期待していました。代わりに、ノードとエッジの約 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 に答える