2011-01-10 7 views
0

로그인 화면이있는 앱이 있습니다. 사용자가 "엔터"를 누르면 상태가 "로그인"&으로 변경되고 하위 구성 요소가로드되도록 트리거됩니다 (아이는 순간에는 보이지 않습니다). 아이는 사용자가 로그인 할 때 필요로하는 많은 기능을 포함하고 있습니다 (예 : 스크린 이름 & 설정이 데이터베이스에서 검색 됨). '부모'에 포함되어 다음구성 요소에 다시 그리기

<local:comp id="localComp" includeIn="login" includeInLayout="false" visible="false"/> 
<mx:Button label="login" click="currentState='login'"/> 
<mx:Button label="logout" click="currentState='Default'"/> 

아이가 '아무튼 사용자가 ('기본 '에 상태 변화) & 다음에 다시 기록 (다시'로그인 '에 대한 상태 변경)을 로그 아웃 할 때 내 문제입니다 다시 "트리거 됨"& 자식이있는 함수는 다시로드되지 않습니다. 우리 아이에게 새로 고침을 강요하는 방법이 있습니까?

참고 : 그냥이 복잡 부모에게 아이의 기능을 이동하기 쉬울 것 동안 ... 나는 쉽게

UPDATE를 수행 할 수 있도록 아이에게 이러한 기능을 이동 : 나는 심지어을 추가하는 시도 내가 오류 얻을로

<s:State name="login" exitState="removeElement(localComp)" /> 

이이 중 하나가 작동하지 않습니다 : 내 상태 "에 의해, exitState" "오류 RangeError :. 인덱스 0 범위를 벗어을"

업데이트 : 부모로부터 자녀의 기능을 호출 할 수는 있지만 오류를 표시하지 않으려면 자녀를 "생성"해야합니다. 플렉스 팀이 왜 아이들을 추가하는 &을 제거하는 것과 같은 이유를 만들지는 모르겠다.

+0

이것을 다른 방식으로 해봅시다. 주 (state)가 바뀌면 localComp에 무엇이 필요합니까? 대신 currentComp에 대한 메서드를 currentStageChange 이벤트에서 호출 할 수 있습니까? –

+0

init();을 호출하면됩니다. localComp에있는 함수. –

답변

0

먼저, 사용자 정의 구성 요소에 includeIn 및 visible + includeInLayout 속성을 둘 다 설정하지 않아도됩니다. includeIn을 사용하면 프레임 워크가 "로그인"이 아닌 다른 상태에있을 때 구성 요소를 표시 목록에서 자동으로 제거합니다.

질문에 대답하기 위해 오히려 addedToStage (사용자 지정 구성 요소 내부) 이벤트 또는 currentStateChanged (부모 구성 요소) 이벤트를 사용합니다. 상태가 로그인으로 변경되면 이러한 이벤트가 트리거되어야합니다.

+0

addedToStage 및 currentStateChanged 이벤트에 대한 봤지만 당신이 무슨 뜻인지 잘 모르겠습니다. 모범이 있습니까? –

0

상태를 전환 할 때마다 자녀가 동일하기 때문에 자녀가 다시 "트리거 됨"을받지 못합니다. Flex는 가시성을 토글하는 것입니다. 여전히 똑같은 객체입니다. addToStage 일 때 특정 작업을 수행하려면 표시 여부를 전환하는 대신 상태가 변경 될 때 해당 하위를 제거/추가해야합니다.

이 일의 유용한 방법은 플렉스 3의 함께 <mx:AddChild/>

예 : 내가 올바르게 읽고 있어요 경우

<mx:states> 

     <mx:State name="login"> 

      <mx:AddChild position="firstChild"> 

       <local:comp id="localComp"/> 

      </mx:AddChild> 

     </mx:State> 
</mx:states> 
+0

flex 4를 사용 중입니다. "상태 재정의가 더 이상 명시 적으로 선언되지 않을 수 있습니다. 레거시 상태 구문은 더 이상 사용되지 않습니다." –

+0

위의 편집을 참조하십시오. 좀 더 유연한 방식으로 접근 해 보았습니다. ... 나는 AddElement & RemoveElement의 모든 종류의 조합을 사용해 보았습니다. (제안 된 AddChild 대신 AddElement 및 RemoveElement를 사용하는 오류가 발생했습니다.) –

+0

오, 내 잘못입니다. 나는 당신이 ''의 –

0

, localComp 로깅의 무거운 처리하는 비 시각적 구성 요소입니다 어떤 서비스에 빠지셨습니까?

enterStatelocalComp에 발사됩니까? 거기에서 init으로 전화 할 수 있습니다. 또는 init()이 구성 요소의 초기화 처리기 인 경우 필요한 모든 배관 작업을 수행하고 실제 로그인시 코드를 별도의 기능으로 이동하십시오.

물론 이것은 실제로 어쨌든 이것을 수행하는 방법이 아닙니다. 모든 인프라가 표시 객체 그래프의 일부가 될 수 있도록 구성 요소에 로직을 넣은 다음 표시하지 않는 것은 낭비입니다.대신 "구성 요소"를 Object 또는 다른 것으로부터 상속 받아 인스턴스를 선언하면됩니다. 그런 다음 loginclick 처리기에서 로직을 직접 호출 할 수 있습니다. 상태를 사용하여 UI의 상태를 업데이트하십시오. 실제로 UI의 상태를 업데이트합니다.

<mx:Button label="login" click="login_clickHandler(event)"/> 
<mx:Button label="logout" click="currentState='Default'"/> 

<fx:Script> 
    <![CDATA[ 
     protected var localComp:MyComponent = new MyComponent(); 

     protected function login_clickHandler(event:MouseEvent):void 
     { 
      localComp.DoLoginStuff(); 
      currentState = 'login'; 
     }  
    ]]> 
</fx:Script>