如何引用运行时添加的Flex元素?

时间:2010-01-17 09:20:37

标签: flex actionscript-3

这感觉就像一个新手问题,所以要自己动手。

我很难在编译时使用'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一样多。有人可以告诉我哪里出错了吗?

2 个答案:

答案 0 :(得分:5)

仅当“objects_id”是与this["objects_id"]对象对应的类的实例变量时,

this.objects_idthis语法才有效。当您在mxml文件中声明<CartesianDataCanvas id="myCdc"/>(比如 CustomCanvas.mxml ,其中<mx:Canvas>为根标记)时,Flex编译器会生成一个名为{{1}的类}扩展 mx.Canvas 并向其添加类型为CustomCanvas的公共变量myCdc。这就是您可以使用CartesianDataCanvas访问它的原因。但是,当您为运行时创建的对象的this.myCdc属性赋值时,不会向该类添加任何变量,因此您无法使用this.id语法访问它。

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

id

答案 1 :(得分:0)

如果您设置name以及id,则应该可以使用Container.getChildByName()