getDefinitionByName()和类可见性

时间:2012-02-23 11:31:35

标签: actionscript-3 flex

我的主应用程序包含ModuleManager。此应用程序加载了不同的模块。主应用程序和加载的模块都使用我的自定义RSL。我需要在我的RSL中获取Class对象,该对象在其中一个模块中定义。我正在尝试使用getDefinitionByName函数,但由于我的类没有在RSL中定义,因此我得到一个异常(尽管加载了需要类的模块)。是否可以使模块类对RSL代码可见并在运行时获取它的实例而不改变项目结构?感谢

2 个答案:

答案 0 :(得分:1)

如果在类型为Class的Module(或其接口)上公开属性,则可以注入类的定义,类似于将类定义注入到按钮中以制作图标。

因此,您的模块可能包含以下代码:

protected var _classToMake:Class;

public function get classToMake():Class {
   return _classToMAke;
}

public function set classToMake(value:Class):void {
   if (value != _classTomake) {
      if (value != null) {
         //test to make sure we're making the right thing
         var testClass:SomeType = new value() as SomeType;
         if (testClass != null) {
            _classToMake = value
         } else {
            trace('classToMake must be a definition that makes a class of SomeType');
         }
      }
   }
}

答案 1 :(得分:1)

加载新模块时,请指定应用程序域。正如文件所说:

"The ApplicationDomain class is a container for discrete groups of class definitions."

在加载SWF时,将应用程序域指定为加载程序上下文的一部分。

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/ApplicationDomain.html

一旦您有对模块加载到的Application Domain的引用,您可以调用Application Domain的getDefinition()方法来获取定义,其方式与getDefinitionByName()非常相似

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/ApplicationDomain.html#getDefinition()

另请参阅以下文档“使用应用程序域”,以获得有关其工作原理的详细说明。

http://help.adobe.com/en_US/as3/dev/WSd75bf4610ec9e22f43855da312214da1d8f-8000.html

这是一个示例的复制粘贴,只是因为徘徊:

package 
{ 
    import flash.display.Loader; 
    import flash.display.Sprite; 
    import flash.events.*; 
    import flash.net.URLRequest; 
    import flash.system.ApplicationDomain; 
    import flash.system.LoaderContext; 

    public class ApplicationDomainExample extends Sprite 
    { 
        private var ldr:Loader; 
        public function ApplicationDomainExample() 
        { 
            ldr = new Loader(); 
            var req:URLRequest = new URLRequest("Greeter.swf"); 
            var ldrContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain); 
            ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler); 
            ldr.load(req, ldrContext);     
        } 
        private function completeHandler(event:Event):void 
        { 
            var myGreeter:Class = ApplicationDomain.currentDomain.getDefinition("Greeter") as Class; 
            var myGreeter:Greeter = Greeter(event.target.content); 
            var message:String = myGreeter.welcome("Tommy"); 
            trace(message); // Hello, Tommy 
        } 
    } 
}