私は、d3の力向グラフを描くためにangularjs指示文を作成しました。このグラフは、新しいノードとリンクで定期的に更新されます。2つの配列が更新されたときのanglejsコールウォッチ
最近、私は、グラフが更新されると、2倍の時間がかかる再描画されていることに気付きました。その部分は、最初にノード配列を更新し、次にエッジ配列を更新し、それぞれが再描画をトリガーする必要があるためです。私は両方が更新された後に呼び出されるようにしたいと思います。
私はOR
関係のために時計に対処する方法についての質問をたくさん見てきましたが、は、私は、具体的にのみAND
のリンクが更新された両方のノードの後に起こることを再描画します。ここで
は私の現在のディレクティブではありません:
graphs.directive('myGraph', [function() {
function renderGraph(scope, elem) {
drawGraph(scope.data, scope.data.params || {}, elem);
scope.$watchCollection('data', function (newData) {
drawGraph(newData, scope.data.params || {}, elem);
});
}
function drawGraph(data, params, elem) {
const rawSvg = elem.find(".svg")[0];
forceDirectedGraph.create(data.nodes, data.links, data.nodeTypes, rawSvg, params);
}
return {
scope: {
data: '='
},
templateUrl: 'graph.html',
link: renderGraph
}
}]);
そして、ここでは、私は、グラフを更新する方法である:
//initialization code:
$scope.graph = { links:[], nodes:[], params:{ /*stuff*/} }
//graph update code:
$http.get(url).then(function(response) {
links = [];
nodes = [];
//process and format links and nodes for d3 from request
$scope.graph.links = links;
$scope.graph.nodes = nodes;
});
ありがとうございます!これまでの結果:オプション2は、最初にページをリフレッシュしたときにグラフを表示するのが好きではなく、その後のナビゲーションで表示されます。 オプション1は私がこれまで行っていることです。しかし、ページから離れてナビゲートすると、それでも2倍の描画が行われます(ただし、他の場合(ページは開いたままで、要求と初期ページの読み込みからグラフが更新されます)。進捗。 – adeady
これは、(1)グラフオブジェクトを最初に初期化するときに 'shouldRedraw'をtrueにデフォルト設定し、(2)時計を作成する前に明示的にグラフを描画しているためです。 2回描画しないようにするには、デフォルトの 'shouldRedraw'をfalseに設定するだけです: ' $ scope.graph = {links:[]、nodes:[]、shouldRedraw:false、params:{/ * stuff * /}} ; – GPicazo
スコープオブジェクトを作成するときに 'draw'をプリエンプティブにfalseに設定しました。そうしなければ100%右側になります。 楽しいために時計の外でdrawGraphステートメントを取り出しました。私は前にそれが必要だったと思うが、今はない。どうもありがとう! – adeady