2010-01-17 37 views
1

这感觉就像一个新手问题,所以要振作起来。如何引用运行时添加的Flex元素?

我很难得到编译时使用'id'属性添加的元素的引用。我看到一些论坛话题表明这是不可能的,并且以这种方式获得对元素的引用更为棘手,但从来不仅仅是这种技巧。这段代码很有趣:Error: uncaught exception: Error calling method on NPObject! [plugin exception: "ReferenceError: Error #1069: Property canvas_tentpoles_0 not found on SGraph and there is no default value."]

public function calledAfterInit(graph_values:Array):void 
{ 
for(var i:int=0; i<graph_values.length; i++) { 
    var cdc:CartesianDataCanvas = new CartesianDataCanvas(); 
    cdc.id = "canvas_tentpoles_"+i; 
    cdc.includeInRanges = false; 
    cdc.visible = false; 
    Areachart.annotationElements = Areachart.annotationElements.concat(cdc); 
    // [...do stuff...] 
} 
// [...later...] 
for(var j:int=0; j<graph_values.length; j++) { 
    drawOnCanvas(j); 
} 
} 

private function drawOnCanvas(index:int):void { 
var canvas:CartesianDataCanvas = this["canvas_tentpoles_"+index]; // ← Error likely from here 
canvas.lineStyle(1); 
canvas.moveTo(10,10); 
canvas.lineTo(10,20); 
// [...etc...] 
} 

我想不必预先添加任何<mx:CartesianDataCanvas>标签比我需要,我会只需要尽可能多的为graph_values.length。有人能告诉我我要去哪里吗?

回答

5

this["objects_id"]this.objects_id仅当“objects_id”是对应于this对象的类的实例变量时,语法才起作用。当您在MXML文件中声明<CartesianDataCanvas id="myCdc"/>(比如CustomCanvas.mxml<mx:Canvas>因为它的根标签),Flex编译器的扩展mx.Canvas,并增加了CartesianDataCanvas类型的公共变量myCdcCustomCanvas生成一个类到它。这就是为什么您可以通过this.myCdc访问它。但是,如果为运行时创建的对象的id属性赋值,则不会向该类添加任何变量,因此无法使用this.id语法访问该变量。

一个简单的解决方法是声明一个数组,将对象存储在该数组中,并根据需要稍后检索元素。

private var tentPoles:Array = []; 
public function calledAfterInit(graph_values:Array):void { 
for(var i:int=0; i<graph_values.length; i++) { 
    var cdc:CartesianDataCanvas = new CartesianDataCanvas(); 
    tentPoles.push(cdc); 
    // ...do stuff... 
} 
// [...later...] 
for(var j:int=0; j<graph_values.length; j++) { 
    drawOnCanvas(j); 
} 
} 

private function drawOnCanvas(index:int):void { 
//read from the array and cast it appropriately 
var canvas:CartesianDataCanvas = CartesianDataCanvas(tentPoles[j]); 
canvas.graphics.lineStyle(1); 
canvas.graphics.moveTo(10,10); 
canvas.graphics.lineTo(10,20); 
// [...etc...] 
} 
0

如果设置name以及id,你应该能够使用Container.getChildByName()

相关问题