我有一个从外部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中的元素,该元素具有从html文件调用特定函数的id。
该函数是getURL_IpDist(),它返回url,xhrget将使用该url获取数据,即/traffic analysis/ get -ip-dist/format/json“+ sc.toURL();
sc是在我的函数尝试获取url之前需要设置的全局变量。这是在另一个外部javascript文件中设置的。有人知道如何在设置变量之前延迟加载dojo或javascript吗?
发布于 2012-04-24 02:19:51
据我所知,您发布的代码位于一个单独的js文件中,并且您使用<script>标记将其包含在内。
您是否尝试过将此代码包装在ready函数中?
require(["dojo/ready"], function(ready){
ready(function(){
// var chart1 = ...
});
});在浏览器解析完整个dom之前,这样做将不会执行代码。它应该包括设置全局变量的其他代码。
发布于 2012-04-25 11:33:21
不使用变量,而使用函数。设置“全局变量”的组件实际上应该调用一个函数来设置相关的全局变量。
然后,应用程序的其他部分可以使用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实例。您使用哪种方法来同步通信取决于应用程序的设计方式以及您的特定需求。
https://stackoverflow.com/questions/10285896
复制相似问题