我有一个字符串类型的全局变量'csId'。在drawChart()函数下面的代码中,在for循环中,当i = 0时,modelLocator应将csID变量设置为'1',当i = 1时,csId应由modelLocator设置为'2'。(考虑到lengh = 2)。 drawchart()中的警报(对于csId)似乎正在打印正确的'csid'值(1和2)但在dataFunction()'columnSeries_labelFunc'中我总是将csId Alert值设为'2'而从不作为' 1' 。
请找到以下代码:
drawchart()函数::
public function drawChart():void
{
var cs:ColumnSeries= new ColumnSeries();
var lenght:Number=AppModelLocator.getInstance().ctsModel.productSummary.getItemAt(0).collMgmtOfcList.length;
myChart.series = [cs];
var tempObj:Object;
for(csLoop=0;csLoop<lenght;csLoop++)
{
cs = new ColumnSeries();
this.csId= new String(String(AppModelLocator.getInstance().ctsModel.productSummary.getItemAt(0).collMgmtOfcList[csLoop]));
Alert.show("csId="+this.csId);
cs.id=this.csId;
cs.displayName = 'Exposure';
cs.dataFunction=columnSeries_labelFunc;
myChart.series[csLoop] = cs;
}
columnSeries_labelFunc()function ::
private function columnSeries_labelFunc(series:Series, item:Object, fieldName:String):Object {
var col:Number=0;
Alert.show("value of csid in columnSeries_labelFunc="+this.csId);
if(fieldName == "yValue" && series.id==csId){
return(item.exposureUSDList[0]);
}else if(fieldName == "yValue" && series.id==csId) {
return(item.exposureUSDList[1]);
}else if(fieldName == "xValue"){
return(item.rptType);
}else
return null;
}
请帮助!!!
答案 0 :(得分:2)
首先:在循环内重复为全局变量赋值是个坏主意。从那以后就什么都不会发生。
从这里的上下文中很难说,但是你遇到这个问题的最可能的原因是执行流程如下:
drawChart()同步执行,计算循环中的每一步,创建ColumnSeries,每个ColumnSeries都会失效,这意味着它们将在下一帧重绘。该函数结束,csID保持最后一个值。
该应用程序进入elastic racetrack的下一步并验证无效的组件。
调用columnSeries_labelFunc,csID仍然保持循环中的终值。
最终结果是在您完成drawChart之前,不会调用columnSeries_labelFunc。
最简单的解决方法是读取您在标签函数中对系列设置的ID,而不是完全依赖于全局变量。