2010-01-17 3 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. При объявлении <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

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

Смежные вопросы