0

外部 js ファイルからレンダリングされるカスタム円グラフがあります。xhrget を使用して、円グラフを作成するために必要なデータを取得します。私が使用している URL にはグローバル変数が含まれていますが、私の問題は、グローバル変数が設定される前にスクリプト内の関数が呼び出されることです。

これが私のコードです:

    var chart1 = new dojox.charting.Chart2D(this.id,{fill:"transparent"});


        chart1.setTheme(dojox.charting.themes.MiamiNice,{fill:"transparent"});

        chart1.addPlot("default", {
        type: "Pie",
        labels: false,
         labelStyle: "rows",
        precision: -10,
        fontColor: "black",
        labelOffset: -20,
        radius: 150
      });

      console.log(this.getURLFunction(this.id ));

        chart1.theme.plotarea.fill = undefined;
        this.xhrDeferred = dojo.xhrGet({
            url: this.getURLFunction(this.id)**,//"../traffic-analysis/get-ip-dist/format/json/ds/1/data/rate/tTime/1334787567/fTime/1334182767/time/604800/drilldown/true/displayedTime/enabled?dojo.preventCache=1334787568120",

            sync: true,
            handleAs: "json",
            preventCache: true,
           load: function(responseObj) {


            var seriesData=[1,2,3,4,5,6,7];
            chart1.addSeries("IP", dojo.map(responseObj.pieItems, function(p){
  return {
    y:    p[1], // value
    text: p[0],  // label
    tooltip:p[0] +": " + p[1]
  };
}));

      var anim_a = new dojox.charting.action2d.MoveSlice(chart1, "default");
      var anim_b = new dojox.charting.action2d.Highlight(chart1, "default");
      var anim_c = new dojox.charting.action2d.Tooltip(chart1, "default");
        chart1.render();

        var chartLegend = new dojox.charting.widget.Legend({
                chart: chart1,
                swatchSize: 12,
            },
            "chartLegend");

            },
            // error: function(error, args) { console.warn("error", error); }
            error: function(error, args) { 

                _this.xhrError = true;
                _this.chartStatusBar.innerHTML = chartErrorMsg(_this.id);
                console.log(error);
            }


        });

url の xhrget の下にある getURLFunction(this.id) は、html ファイルから特定の関数を呼び出す ID を持つ html 内の要素を参照します。

その関数は getURL_IpDist() であり、xhrget が /traffic-analysis/get-ip-dist/format/json" + sc.toURL(); であるデータを取得するために使用する URL を返します。

sc は、関数が URL を取得しようとする前に設定する必要があるグローバル変数です。これは、別の外部 JavaScript ファイルで設定されます。変数が設定される前に dojo または javascript のロードを遅らせる方法を知っている人はいますか?

4

2 に答える 2

0

あなたが投稿したコードは別のjsファイルにあり、<script>タグを使用してそれを含めていることを私は理解しています。

このコードをready関数でラップしようとしましたか?

require(["dojo/ready"], function(ready){
    ready(function(){

        // var chart1 = ...

    });
});

これを行うと、ブラウザーが dom 全体を解析するまでコードは実行されません。グローバル変数を設定する他のコードを含める必要があります。

于 2012-04-23T18:19:50.677 に答える
0

変数を使用する代わりに、関数を使用します。「グローバル変数」を設定するコンポーネントは、実際には、問題のグローバル変数を設定する代わりに関数を呼び出す必要があります。

その後、アプリケーションの他の部分は dojo.connect() を使用して関数に接続できるため、関数が呼び出されるたびに、dojo は関数に接続されているすべてのハンドラーを呼び出します。例えば:

global.setVar = function(value) {
  global.var = value;
}
...
dojo.connect(global, 'setVar', null, function() {
  alert("Global variable has been set to: "+global.var);
});

Dojo のサブスクライブ/パブリッシュ機能を使用して、同様の機能を取得したり、独自の dojo.Deferred インスタンスを取得したりすることもできます。通信を同期するためにどの方法を採用するかは、アプリケーションの設計方法と特定のニーズによって異なります。

于 2012-04-25T03:33:20.730 に答える