2009-09-24 6 views
1

내가 swf A와 B 두 개를 가지고 있고 런타임에 swf A가 swf B를로드하고 파일 사이의 코드를 공유하여 파일 크기와 다운로드 시간을 최소화한다고 가정 해 보겠습니다.swf간에 코드 공유

swf B에 몇 가지 코드 (예 : com.blah.HelloWorld)가있는 경우 swf A의 클래스 경로에서 swf B의 소스를 갖도록 컴파일러에 지시하지만 컴파일 타임 링크 만 수행하고 com.blah는 실제로 컴파일하지 않습니다. HelloWorld into swf A.

이것은 작동하며, -includes 및 -externs 컴파일러 옵션을 사용하여이 작업을 시도했습니다.

그러나 내 문제는 내가 다른 방식으로 이것을하고 싶다는 것입니다. swf A와 B (그리고 잠재적으로 swf C) 모두 com.blah.HelloWorld가 필요하지만 com.blah.HelloWorld를 swf A로 컴파일하고 swf B에서 외부 참조로 사용하고 싶습니다. .)

나는 externs와 includes를 사용하여이 작업을 시도했지만 이것을 할 때 ReferenceErrors를 얻는다.

별도의 rsl이없는 을 사용하고 싶습니다. 따라서 HTTP 요청 수를 줄일 수 있습니다. 이것이 가능합니까?

+0

여기 http://stackoverflow.com/questions/1455144/circular-dependencies-in-flex-libraries 비슷한 할 노력하고있어 불행하게도, 난 어떻게하는지 아직 알지 못했다. – Turambar

답변

1

modules으로 플렉스 애플리케이션을 분할 할 수 있습니다.

아니면 ApplicationDomain 클래스의 getDefinition 방법을 사용하여 런타임에로드되었던 SWF에서 개별 클래스에 액세스 할 수 있습니다 :이 정확하게 당신이 원하는 경우에 확실하지 않다

var loader:Loader = new Loader(); 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoad); 
loader.load(new URLRequest("c.swf")); 
//.. 
private function onLoad(e:Event):void 
{ 
    var domain:ApplicationDomain = LoaderInfo(e.target).applicationDomain; 
    var Type:Class = domain.getDefinition("pack.MyComponent") as Class; 
    var myBox:Sprite = new Type(); 
    addChild(myBox); 
} 
0

질문을 잘 이해하고 있는지 잘 모르겠지만 AS3 로더 클래스를 사용하여 원하는 것을 할 수 있다고 생각합니다. 형식은 다음과 같을 것입니다. 우리가 주 응용 프로그램 ("a.swf"라고 부름)을 만들고 다른 응용 프로그램 ("b.swf"라고 함)에 컴파일 된 메서드와 속성에 액세스하려고한다고 가정 해 봅시다.), 당신은 이것을 할 것입니다 :

var SWFB:Object; // empty at first as a placeholder. 

var url:URLRequest = new URLRequest("b.swf"); 
var l:Loader = new Loader(); 
l.contentLoaderInfo.addEventListener(Event.COMPLETE, loaded); 
l.load(url); 

function loaded(e:Event):void { 
SWFB = e.currentTarget.content as Object; 
initApp(); 
} 

function initApp():void { 
SWFB.someMethodCall(); 
} 

... 그리고 나는 그것이 효과가 있다고 생각합니다. 나는 그것을 지금 시험 할 수는 없지만 시험해보고 알려줘. 기본적으로 b.swf를 기본 객체로로드 할 것이므로 해당 객체에 대해 메소드를 호출 할 수 있습니다.

그게 효과가 있다면 알려주세요. 그렇지 않으면 내일 다시 조정할 수 있습니다.