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

Imp*_*tor 1 apache-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...]
}
Run Code Online (Sandbox Code Playgroud)

我不想预先添加任何<mx:CartesianDataCanvas>我需要的标签,而且我只需要多少graph_values.length.有人可以告诉我哪里出错了吗?

Ama*_*osh 5

this["objects_id"]this.objects_id只有当"objects_id"是对应的类的实例变量时,语法才有效this.当你声明<CartesianDataCanvas id="myCdc"/>在MXML文件(说CustomCanvas.mxml<mx:Canvas>,因为它的根标签),Flex编译器的名称生成一个类CustomCanvas扩展mx.Canvas,并增加了一个公共变量myCdc类型的CartesianDataCanvas吧.这就是您能够访问它的原因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...]
}
Run Code Online (Sandbox Code Playgroud)