2010-02-08 5 views
1

내 응용 프로그램의 한 영역에서 루프 중에 actionscript를 사용하여 자체 빌드하는 디스플레이를 만들고 있습니다. 내 실제 애플 리케이션에는 중첩 된 자식 LOT 내 함수가 그 어린이 중 하나를 찾고있을 수 있습니다.)에서 나는 각 항목에 ID를 할당하지만 그 항목에 액세스하려고하면 ID는 실패합니다. 뭐라 구요? 가능한 모든 부모를 아는 일없이 UI 구성 요소를 찾는 방법은 무엇입니까?동적으로 만들면 ID로 항목에 액세스하는 방법을 알아낼 수 없습니다.

다음은 내가하는 일에 대한 간단한 예입니다. 버튼을 클릭

ReferenceError: Error #1069: Property myPanel3 not found on Test and there is no default value.

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init();"> 
    <mx:Script> 
     <![CDATA[ 
      import mx.containers.Panel; 
      private function init():void{ 
       var i:uint = 0; 
       for(i = 0; i<10; i++){ 
        var loopPanel:Panel = new Panel; 
        loopPanel.title = i.toString(); 
        loopPanel.id = "myPanel" + i.toString(); 
        myVBox.addChild(loopPanel); 
       } 
      } 

      private function clicked():void{ 
       var tracePanel:Panel = this["myPanel3"]; 
       trace(tracePanel); 
      } 
     ]]> 
    </mx:Script> 
    <mx:VBox id="myVBox" x="10" y="10" width="500"/> 
    <mx:Button id="myBtn" x="518" y="8" label="Click Me" click="clicked();"/> 
</mx:Application> 

답변

2

이 시도 오류와 함께 실패합니다

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init();"> 
<mx:Script> 
    <![CDATA[ 
     import mx.containers.Panel; 
     private function init():void{ 
      var i:uint = 0; 
      for(i = 0; i<10; i++){ 
       var loopPanel:Panel = new Panel; 
       loopPanel.title = i.toString(); 
       loopPanel.name = "myPanel" + i.toString();         
       myVBox.addChild(loopPanel); 
      } 
     } 

     private function clicked():void{ 
      var tracePanel:DisplayObject = myVBox.getChildByName("myPanel3");     
      trace(tracePanel.name); 

     } 
    ]]> 
</mx:Script> 
<mx:VBox id="myVBox" x="10" y="10" width="500"/> 
<mx:Button id="myBtn" x="518" y="8" label="Click Me" click="clicked();"/> 


변경을 두 줄에 :

loopPanel.name = "myPanel" + i.toString(); 

var tracePanel:DisplayObject = myVBox.getChildByName("myPanel3");  

중첩 - 당신은 아마 사전을 만들어야합니다 (예. 하위 구성 요소를 검색하지 않고도 액세스해야하는 경우 사용자 지정 개체의 "이름"- "개체 참조"쌍을 가진 배열).

+0

그것이 작동하는 동안 나는 VBoxes ID, 이름 또는 그것이 존재하는 경우에도 패널에 액세스하는 방법이 필요합니다. 마찬가지로 실제 응용 프로그램은 샘플보다 훨씬 복잡하고 모든 부모 수준을 거쳐야하는 더 깨끗한 접근 방식을 원합니다. – invertedSpear

+0

마지막 단락을 확인하십시오, 나는 거기에 내장 된 스토리지가 있다고 생각하지 않습니다. 또는 매번 오브젝트 트리를 사용할 수 있습니다. –

+0

사전은 좋은 생각입니다. 이전에는 그런 식으로 일을 생각하지 않았습니다. 직접 ID를 지정하는 것과 같습니다. ID를 즉시 할당하는 것이 효과가없는 이유는 무엇입니까? – invertedSpear

관련 문제