注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

神魔破杜梓的叨叨堂

Programming every day!

 
 
 

日志

 
 
 
 

自定义类似多文档窗口的Module Loader  

2007-11-21 16:37:13|  分类: My Tech |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

<?xml version="1.0" encoding="utf-8"?>
<mx:ViewStack xmlns:mx="http://www.adobe.com/2006/mxml"
 width="100%" height="100%"
 change="onChange(event);">
 <mx:Metadata>
  [Event(name="loading", type="flash.events.Event")]
  [Event(name="loading", type="flash.events.Event")]
  [Event(name="urlChanged", type="flash.events.Event")]
  [Event(name="setup", type="mx.events.ModuleEvent")]
  [Event(name="ready", type="mx.events.ModuleEvent")]
  [Event(name="error", type="mx.events.ModuleEvent")]
  [Event(name="progress", type="mx.events.ModuleEvent")]
  [Event(name="unload", type="mx.events.ModuleEvent")]
 </mx:Metadata>
 <mx:Script>
  <![CDATA[
   import mx.events.IndexChangedEvent;
   import mx.core.Container;
   import flash.display.DisplayObject;
   import mx.modules.ModuleManager;
   import mx.collections.ArrayCollection;
   import mx.modules.IModuleInfo;
   import mx.events.FlexEvent;
   import flash.system.ApplicationDomain;
   import mx.events.ModuleEvent;
   
   
   public var applicationDomain:ApplicationDomain;
   
   public var currentDisplayedModule:IModuleInfo;
   
   [Bindable]
   public var moduleCollection:ArrayCollection = new ArrayCollection(); 
     
   private var _url:String = null;
   
      public function get url():String
      {
          return _url;
      }
  
      public function set url(value:String):void
      {
    if(moduleCollection.length>0)
    {
           if (value == currentDisplayedModule.url)
           {
            return;
           }
          
           for each(var module:IModuleInfo in moduleCollection)
           {
            if(module.url == value)
            {
             this.selectedIndex = moduleCollection.getItemIndex(module);
             currentDisplayedModule = moduleCollection.getItemAt(this.selectedIndex) as IModuleInfo;
             return ;
            }
           }
          
           if(currentDisplayedModule)
           {
            currentDisplayedModule.removeEventListener(ModuleEvent.PROGRESS , moduleProgressHandler);
               currentDisplayedModule.removeEventListener(ModuleEvent.SETUP ,  moduleSetupHandler);
               currentDisplayedModule.removeEventListener(ModuleEvent.READY ,  moduleReadyHandler);
               currentDisplayedModule.removeEventListener(ModuleEvent.ERROR ,  moduleErrorHandler);
               currentDisplayedModule.removeEventListener(ModuleEvent.UNLOAD ,  moduleUnloadHandler);
           }
      }
      
      _url = value;
      
      if(_url!=null)
      {
       loadModule();
    }
  
          dispatchEvent(new FlexEvent(FlexEvent.URL_CHANGED));             
      }
     
      public function loadModule():void
      {
          if (url == null)
          {
              //trace("loadModule() - null url");
              return;
          }
  
          dispatchEvent(new FlexEvent(FlexEvent.LOADING));
  
          var module:IModuleInfo = ModuleManager.getModule(url);
         
          module.addEventListener(ModuleEvent.PROGRESS, moduleProgressHandler);
          module.addEventListener(ModuleEvent.SETUP, moduleSetupHandler);
          module.addEventListener(ModuleEvent.READY, moduleReadyHandler);
          module.addEventListener(ModuleEvent.ERROR, moduleErrorHandler);
          module.addEventListener(ModuleEvent.UNLOAD, moduleUnloadHandler);
  
          module.load(applicationDomain);
         
          currentDisplayedModule = module;
         
          this.moduleCollection.addItem(currentDisplayedModule);
      }
     
      public function unloadModule():void
      {
       for each(var child:DisplayObject in this.getChildren())
       {
        child = null;
       }
       this.removeAllChildren();
    
    for each(var module:IModuleInfo in this.moduleCollection)
    {
     module.removeEventListener(ModuleEvent.PROGRESS,moduleProgressHandler);
              module.removeEventListener(ModuleEvent.SETUP, moduleSetupHandler);
              module.removeEventListener(ModuleEvent.READY, moduleReadyHandler);
              module.removeEventListener(ModuleEvent.ERROR, moduleErrorHandler);
  
              module.unload();
              module.removeEventListener(ModuleEvent.UNLOAD, moduleUnloadHandler);
              module = null;
    }
    moduleCollection.removeAll();
      }           
     
      private function moduleProgressHandler(event:ModuleEvent):void
      {
          dispatchEvent(event);
      }

      private function moduleSetupHandler(event:ModuleEvent):void
      {  
          dispatchEvent(event);
      }

      private function moduleReadyHandler(event:ModuleEvent):void
      {
          var newChild:DisplayObject = this.addChild(currentDisplayedModule.factory.create() as DisplayObject);
    this.selectedChild = newChild as Container;
          dispatchEvent(event);
      }

      private function moduleErrorHandler(event:ModuleEvent):void
      {
          unloadModule();
          dispatchEvent(event);
      }

      private function moduleUnloadHandler(event:ModuleEvent):void
      {
          dispatchEvent(event);
      }
     
      private function onChange(evt:IndexChangedEvent):void
      {
       /***
        * 将当前的module与显示出来的的child同步
        */
       this.currentDisplayedModule = this.moduleCollection.getItemAt(evt.newIndex) as IModuleInfo;
      }
  ]]>
 </mx:Script>
 
</mx:ViewStack>
主要继承ViewStack,参照FLex framework中的ModuleLoader实现完成。

其中unload()方法未经测试,如要使用,还是自己测试一下的好自定义类似多文档窗口的Module Loader - hydra1983 - Edisons Closet

  评论这张
 
阅读(542)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017