2012-04-23 88 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实例。您使用哪种方法来同步通信取决于您的应用程序的设计方式以及您的具体需求。