2010-01-17 16 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()

相關問題