2011-08-04 4 views
0

Flex 4에 몇 가지 사용자 지정 구성 요소를 작성하고이 문제를 몇 번 실행합니다.MXML 클래스 초기화 순서

var myForm:MyForm = new MyForm; 
myForm.SetData(data); 
addElement(myForm); 

이제 패널이나 VGroup (또는 다른 컨테이너)의 생성자가 아닌 함수에서이 함수를 호출한다고 가정 해 보겠습니다. Annoyingly, MyForm.SetData() 중에 선언 된 myForm의 모든 필드가 아직 초기화되지 않았습니다. 예를 들면 :

<s:VGroup id="dataGroup"> 

만약 내 SetData를() - DATAGROUP이 아니기 때문에 함수가, 그냥 nullpointer 예외와 함께 실패 (.addElement에 이유()는 단지 데이터를 받았다 용) DATAGROUP에 액세스하려고합니다 이 생성자 이후에도 불구하고 생성되었습니다. 양식이 완전히 초기화되었는지 어떻게 확인할 수 있습니까?

답변

3

이벤트를 수신하고 해당 이벤트의 처리기에서 구성 요소를 추가하는 것이이 작업의 한 가지 방법입니다. 이것은 Sam DeHaan이 제안한 것입니다.

이렇게 할 수있는 또 다른 방법은 createChildren() 기능을 재정의하는 것입니다. 이 함수는 구성 요소의 하위 구성 요소를 모두 만들고 추가하는 함수입니다. docs on the component lifecycle는이 주제에 대한 세부 사항의 톤을 제공 할 것입니다

override public function createChildren():void 
{ 
    super.createChildren(); 

    var myForm:MyForm = new MyForm; 
    // Note that data may be null here, best to 
    // override commitProperties() to set it. 
    myForm.SetData(data); 
    addElement(myForm); 
} 

: 코드는 다음과 같이 보일 것이다.

+0

정확히 내가 찾던 문서였습니다. –

+0

@kdansky, 그렇다면이 대답을 받아 들여야합니다 :) –

1

내가 질문을 오해하고있어하지 않는 한,

당신은 정의가 필요 컨테이너에 의 creationComplete 콜백이 널 포인터 예외로 실행되는 코드를 삽입해야합니다.

+0

콜백을 사용하는 것 외에 다른 방법이 있습니까? 이러한 함수가 실행되는 순서를 제어하는 ​​것이 좋을 것입니다. 그렇지 않으면 내부 플래그를 사용하여 귀찮은 해결 방법을 작성해야합니다. –

+0

예쁜 것은 아니지만 callLater를 사용할 수 있습니다. 뭔가 : : callLater (addElement, [myForm]). 그러나 VGroup/Panel 등 내부에 있지 않으면 callLater (dataGroup.addElement ...)를 호출 할 수 없습니다. callLater는 다음 프레임까지 대기하므로 응용 프로그램에 따라 VGroup을 신뢰할 수 있습니다 생성 된. –