1

dojox.charting でグラフ グラフィックを作成する次のコードがあります。

function createChart() {
  var node = dojo.byId("surfaceDiv");
  while (node.hasChildNodes())
  {
    node.removeChild(node.lastChild); // remove all the children graphics
  }
  var nodes =  "<div id='chart1' style='width: 10px; height: 10px;'></div><div id='legend1' ></div>";
  dojo.html.set(node, nodes);
  var nodeChart = dojo.byId("chart1");
  var nodeLegend = dojo.byId("legend1");

  var chart1 = new dojox.charting.Chart2D(nodeChart);
  // set chart types and point series
  chart1.render();
  // now to add legend:
  var legendNode = new dojox.charting.widget.Legent(
     {chart: chart1}, nodeLegend.id));
}

関数は最初の呼び出しでは正常に機能します。ただし、もう一度呼び出すと、チャートは正常に表示されますが、凡例は表示されません。firebug で、manager.xd.js (8 行目) に「id==legend1 でウィジェットを登録しようとしましたが、その ID は既に登録されています」というエラーがあることに気付きました。dojox のライブラリーのどこかに、同じ ID を持つ前の凡例オブジェクトがキャッシュされているようです。

以前に登録またはキャッシュされた凡例を消去する必要があると思います。どうやってやるの?

ところで、私の html ページには、JavaScript 関数を呼び出して id="surfaceDiv" の div ノードにさまざまなグラフィックを描画するためのいくつかのアンカー リンクがあり、「凡例ノード」は id="legendDiv" の次の div です。 、上記の関数を再度呼び出すことができます。

4

4 に答える 4

1

伝説のrefresh()方法を使ってみませんか?それはうまくいくでしょう。

于 2011-03-07T23:39:09.190 に答える
1

私はdojox1.3.0を使用していますが、エラーなしで次の機能が正常に機能することがわかりました(凡例はグローバル変数です)。

if (legend != undefined) {
  legend.destroyRecursive(true); 
} 

legend = new dojox.charting.widget.Legend({chart: chart1,horizontal: true}, 'legend');

//or try this
var myObj = new dojoObject(...);
...
// do whatever we want with it
...
// now we don't need it and we want to dispose of it
myObj.destroy();
delete myObj;

この場合、凡例は再作成される前に破棄されます。

このテーマに関する別のリンクは次のとおりです:http: //www.dojotoolkit.org/forum/dojox-dojox/dojox-support/how-unregister-legend-dojox-charting

于 2009-08-20T17:49:39.413 に答える
0

これは dojox.charting.widget.Legend(...) のバグだと思います。私がしたことは、div "surfaceDiv" の下のすべてのグラフィックスと凡例の DOM 要素を消去し、チャート用の新しい div "chart1" と div "legend1" を凡例として追加することでした。チャートは正常に機能しますが、凡例は機能しません。私のhtmlには、関数への次のアンカーリンク呼び出しがあります。

....
<a href="javascript:createChart();">Curve chart</a>
....

その結果、関数 createChart() は、同じ Web ページ セッション内で複数回呼び出すことができます。グラフと凡例が初めて表示されたが、その後の呼び出しまたはクリックで凡例が表示されなかった。

この問題またはバグを回避するには、凡例 ID を異なる値で動的に設定する必要があります。dojox.charting.widget.Legend(...) 内のキャッシュされた凡例 ID 値は、新しい ID と競合しません。コードは次のとおりです。

var legendCount = 0; // global value 

function createChart() {
  var node = dojo.byId("surfaceDiv");
  while (node.hasChildNodes())
  {
    node.removeChild(node.lastChild); // remove all the children graphics
  }
  var legendID = "legend" + legendCount++;
  var nodes =  "<div id='chart1' style='width: 10px; height: 10px;'></div>" +
    "<div id='" + legendID + "' ></div>"; // Set legend ID dynamically
  dojo.html.set(node, nodes);
  var nodeChart = dojo.byId("chart1");
  var nodeLegend = dojo.byId(legendID);

  var chart1 = new dojox.charting.Chart2D(nodeChart);
  // set chart types and point series
  chart1.render();
  // now to add legend:
  var legendNode = new dojox.charting.widget.Legent(
    {chart: chart1}, nodeLegend.id)); // no more conflict legend's ID
}

コードと HTML ページを再度テストしました。伝説は毎回表示されます!

于 2009-03-27T18:20:49.480 に答える