Как ссылаться на элементы Flex, добавленные во время выполнения? - PullRequest
1 голос
/ 17 января 2010

Это похоже на вопрос новичка, так что приготовьтесь.

У меня возникают трудности с получением ссылки на элементы, добавленные после компиляции, с помощью свойства '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 ]

5 голосов
/ 17 января 2010
Синтаксис

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...]
}
0 голосов
/ 19 января 2010

Если вы установите name, а также id, вы сможете использовать Container.getChildByName().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...