2012-04-23 85 views
0

我有來自外部的js文件所呈現的自定義餅圖中Dojo小部件的功能。我使用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); 
      } 


     }); 

的xhrget的URL下getURLFunction(this.id)是指一個元素在具有調用從HTML文件中的特定功能的ID的HTML。

該功能是getURL_IpDist(),它返回的xhrget會用得到它/流量分析/ GET-IP-DIST /格式/ JSON的」 + sc.toURL()中的數據的URL;

sc是在我的函數試圖抓取url之前需要設置的全局變量,這是在另一個外部javascript文件中設置的 有沒有人知道如何在變量設置之前從加載延遲dojo或javascript?

回答

0

這是我的理解,您發佈的代碼生活在一個單獨的js文件中,並且您正在使用<script>標籤包含它。

您是否嘗試過在一個ready函數包裝這個代碼?

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

     // var chart1 = ... 

    }); 
}); 

這樣做將不會執行代碼,直到瀏覽器解析完整個dom爲止。其中應包括設置全局變量的其他代碼。

+0

我想我忘了指定,我想提出一個定製的Dojo小部件。如此包裝只會給我一個錯誤。此外,我正在使用舊版的dojo,因爲這是我目前需要使用的。 – asqwrd 2012-04-23 19:04:29

0

而不是使用變量,使用的功能。設置「全局變量」的組件實際上應該調用一個函數來設置有問題的全局變量。然後

您的應用程序的其他部分可以使用dojo.connect()來連接功能,使隨時隨地的叫法,道場將調用與函數的任何處理。例如:

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實例。您使用哪種方法來同步通信取決於您的應用程序的設計方式以及您的具體需求。