2011-09-22 3 views
2

adobe flex documentation과 같은 모듈 통신용 인터페이스를 사용하고 있습니다. mxml에 ModuleLoader가 있으면 모든 것이 잘 작동합니다.Flex에서 인터페이스에 캐스팅하는 데 문제가 있습니다.

<mx:TabNavigator id="testNav" 
       height="100%" 
       width="100%"> 
     <s:ModuleLoader id="firstTab" 
         label="ONE" 
         width="100%" 
         url="path/to/module/Mod1.swf"/> 

     <s:ModuleLoader id="secondTab" 
         label="TWO" 
         width="100%" 
         url="path/to/module/Mod2.swf"/> 


</mx:TabNavigator> 

가 나는

var someChild:* = firstTab.child as ISomeModule; 

ISomeModule 인터페이스 인 코드를 갖는다. 내가 다른 파일에서 ActionScript의 ModuleLoader있을 때 나는 같은 일을 수행 할 때

var myLoader:ModuleLoader=new ModuleLoader(); 
myLoader.percentHeight=50; 
myLoader.percentWidth=50; 
myLoader.loadModule(moduleURL + "?attr=value&attr2=" + parentDocument.attr2); 

을 ISomeModule 다른 기능에, 나는

var childMod:* = myLoader.child as ISomeModule; 

myLoader.child은이 캐스팅 할 때 는하지만, someChild가 null이된다 null는 아니지만 ISomeModule로 캐스트하면 null이됩니다. 누구든지이 문제를 해결하는 방법에 대한 아이디어가 있습니까? 감사

+0

당신은 당신이 인터페이스로 캐스팅 할 수 있는지 있습니까? Object에 캐스트하지 않아도됩니까? 가변 유형은 인터페이스가 될 수 있습니다. 하지만 런타임에 해당 인터페이스를 구현하는 객체를 사용해야합니다. 그것이 잘못되었다고 가정합니다. 당신이 시도 : IssomeModule (firstTab.child)? firstTab [그리고 그 아이]가 유효한 값을 가지고 있다고 확신합니까? 그들은 null 일 수 있었습니까? – JeffryHouser

+1

아니, firstTab 및 자식은 괜찮습니다. 테스트 한 결과 ISomeModule에서 선언 한 함수로 작업 했으므로 [공식 문서] (http://help.adobe.com/en_US/flex/using) 에서처럼 좋았습니다. /WS2db454920e96a9e51e63e3d11c0bf64277-7fea.html#WS2db454920e96a9e51e63e3d11c0bf69084-7d1d) – Mansuro

+0

캐스트를 수행 할 때 디버거에서'myLoader.child'를 살펴 보았습니까? 디버거에는 어떤 유형이 표시됩니까? 원하는 인터페이스를 구현합니까? –

답변

3

2 일 :

  • 당신은 (당신은 또한 당신의 모듈 컴파일에 최적화 활성화해야합니다) 크로스 모듈 클래스 공유를위한 동일한 ApplicationDomain에 필요합니다 <s:ModuleLoader url="someURL" applicationDomain="{ApplicationDomain.currentDomain}" />
  • 내가 정확히 기억한다면, 그것이 있어야 firstChild.content이고 실제 모듈 자체는 firstChild.child이 아닙니다.
+0

moduleLoader에는 속성 콘텐츠가 없습니다. – Mansuro

0

이 게시물은 꽤 오래되었지만 현재 AS3으로 ModuleLoader를 동적으로 생성하여 비슷한 문제가 발생했습니다. ApplicationDomain을 설정하기위한 위의 힌트는 저의 ... 감사합니다!

private function createModule():void { 
    _moduleLoader = new ModuleLoader; 
    _moduleLoader.applicationDomain = ApplicationDomain.currentDomain; 
    _moduleLoader.addEventListener(ModuleEvent.READY, onModuleReady); 
    _moduleLoader.url = "path/to/your/module/MyModule.swf"; 
    _moduleLoader.loadModule(); 
} 

private function onModuleReady(event:ModuleEvent):void { 
    // iMyModule is null if ApplicationDomain is not set 
    var iMyModule:* = event.currentTarget.child as IMyModule; 
} 

감사합니다, 올라프