2012-01-27 3 views

답변

2

정말 쉬운 방법은 없습니다. 당신이 할 수있는 일은 이것이다 : 당신이

  • 이 기본 구현 대신 클래스를 사용하는 플렉스에게
  • 어디서나들을 수

    • 이 응용 프로그램에 이벤트를 전달하게 사용자 정의 PopUpManager를 만들

    PopUpManager에이

    우리는 우리가 일부 사용자를 추가 할 수있는 사용자 정의가 PopUpManager 클래스를 생성 사용자 정의 만들기 기능. 예를 들어, 응용 프로그램에 이벤트를 전달하면 displayList의 모든 곳에서 이벤트를 수신 할 수 있습니다. 우리는 Flex에서 사용되는 기본 구현 인 PopUpManagerImpl을 확장 할 것입니다.

    public class MyPopupManager extends PopUpManagerImpl { 
    
        private static var instance:IPopUpManager; 
    
        static public function getInstance():IPopUpManager 
        { 
         if (!instance) instance = new MyPopupManager(); 
         return instance; 
        } 
    
        override public function addPopUp(
         window:IFlexDisplayObject, 
         parent:DisplayObject, 
         modal:Boolean=false, 
         childList:String=null, 
         moduleFactory:IFlexModuleFactory=null):void 
        { 
         super.addPopUp(window, parent, modal, childList, moduleFactory); 
         var app:IEventDispatcher = 
          IEventDispatcher(FlexGlobals.topLevelApplication); 
         app.dispatchEvent(new Event("popupAdded", true)); 
        } 
    
    } 
    

    팝업이 표시 될 때마다 버블 링 이벤트를 보내려면 addPopup 메서드를 재정의하십시오. 지금은 getInstance() 메소드를 무시하십시오. 나는 나중에 그것을 다시 할 것이다. FlashBuilder는 숨겨진 것으로 표시 되었기 때문에 가져 오기 중 일부를 자동 작업하지 않습니다. 아무것도 걱정 없습니다하지만 당신은 수동으로 가져 오기 문을 작성하기위한해야합니다 :

    :

    import mx.managers.IPopUpManager; 
    import mx.managers.PopUpManagerImpl; 
    

    이 상당히 쉬울 것이다 기본 구현

    대신 클래스를 사용하는 플렉스에게

    import mx.core.Singleton; 
    Singleton.registerClass("mx.managers::IPopUpManager", MyPopupManager); 
    

    유일한 문제는 Flex가 이미 구현을 등록했으며 'preinitialize'에서 이것을 실행하더라도 무시할 수 없다는 것입니다. 따라서 Flex가 부트 스트랩을 시작하기 전에해야 할 일입니다. 다음을 위해 사용자 정의 프리 로더를 사용합니다.

    public class RegisteringPreloader extends DownloadProgressBar { 
    
        override public function initialize():void { 
         super.initialize(); 
         Singleton.registerClass("mx.managers::IPopUpManager", MyPopupManager); 
        } 
    
    } 
    

    DownloadProgressBar가 기본 Flex 프리 로더입니다. 추가 등록 코드를 추가하기 만하면됩니다. 지금이 프리 로더를 사용하는 응용 프로그램을 말하는 것을 잊지 말라 :

    <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark" 
           xmlns:mx="library://ns.adobe.com/flex/mx" 
           preloader="RegisteringPreloader" > 
    

    이제 MyPopupManager가 가질 않는 이유를 단지

    이제

    addEventListener("popupAdded", onPopupAdded); 
    PopUpManager.addPopUp(new Panel(), this); 
    

    추가 행사 정보를 수신 정적 getInstance() 메소드가 있습니까? 우리의 구현을 등록하는 데 사용한 Singleton 클래스는 등록한 모든 클래스가 싱글 톤이기 때문에 'getInstance'라는 메서드를 가질 것으로 기대하기 때문입니다. 이 메서드를 호출하려고 시도하고 존재하지 않는 경우 충돌합니다. 싱글 톤이 무엇인지 모르는 경우, 그냥 구글. 수많은 정보를 찾을 수 있습니다.

    추신 : 실제로이 질문을 해결하기 위해 새로운 것을 배웠습니다 (감사합니다).

    +0

    감사합니다. 나는 새로운 것을 배울 수있어서 기쁘다. ;) 당신 말이 맞아요. 이 방법은이를 수행하는 방법이지만이 기능의 범위를 벗어납니다. systemManager addChild 또는 addedToStage 이벤트를 수신하는 것은 어떻습니까? systemManager numOfElements 또는 numOfChildren이 바인드 가능합니까? systemManager.numOfElements <1에 가시성을 바인딩 할 수 있습니까? –

    +0

    학습에서 Singleton.registerClass가 어떤 클래스에서 작동하는지 알고 있습니까? 내 악의적 인 목적으로 사용할 수 있습니까? –

    +0

    추가 할 댓글이 1 개 더 있습니다. PopUpManager가 구현을 가리킬 때 공개 선언이 작동하지 않으므로이 정보를 찾은 것이 좋습니다. –

    0

    SparkApplication의 경우 RIAStar의 답변에 몇 가지 수정을해야했습니다. preloader.initialize()에 아직 내 맞춤 클래스가 없으므로 (ApplicationDomain.currentDomain.getDefinition()) PRELOADER_DOC_FRAME_READY 이벤트에 대한 이벤트 리스너를 추가했습니다.

    package com.mydomain.preloaders { 
    
        import flash.display.Sprite; 
        import flash.events.Event; 
        import flash.system.ApplicationDomain; 
        import flash.utils.getDefinitionByName; 
    
        import mx.core.Singleton; 
        import mx.events.FlexEvent; 
        import mx.preloaders.SparkDownloadProgressBar; 
    
        public class RegisteringPreloader extends SparkDownloadProgressBar { 
    
         public function RegisteringPreloader() { 
    
         } 
    
         public var preloaderSprite:Sprite; 
    
         override public function set preloader(value:Sprite):void { 
          super.preloader = value; 
    
          preloaderSprite = value; 
    
          value.addEventListener(FlexEvent.PRELOADER_DOC_FRAME_READY, preloaderCompleteHandler); 
    
         } 
    
         protected function preloaderCompleteHandler(event:Event):void { 
          var myCustomClass:Class; 
          var classPath:String; 
          var hasDefinition:Boolean; 
    
          preloaderSprite.addEventListener(FlexEvent.PRELOADER_DOC_FRAME_READY, preloaderCompleteHandler); 
    
          classPath = "com.domain.managers::MyClassImpl"; 
          hasDefinition = ApplicationDomain.currentDomain.hasDefinition(classPath); 
    
          if (hasDefinition) { 
           myCustomClass = Class(getDefinitionByName(classPath)); 
    
           Singleton.registerClass("mx.managers::ISingletonClass", myCustomClass); 
          } 
         } 
        } 
    } 
    

    나머지 단계는 RIAStar 's와 동일합니다.

    관련 문제