【问题标题】:AS3 - Accessing Library Items from outside the Document classAS3 - 从 Document 类外部访问库项目
【发布时间】:2010-11-23 14:39:49
【问题描述】:

如何从文档类以外的类访问库项目?

例如,如果我在 Flash 中创建一个影片剪辑并将其导出为名称为 Foo 的 Actionscript,我可以在文档类中执行此操作:

var f = new Foo();
this.addChild(f);

它应该出现在舞台上。但我需要能够从其他类创建该对象的其他实例。如果我在 SomeOtherClass.as 中使用上面相同的代码,我在舞台上什么也得不到,显然是因为这个类不知道库中的 Foo 对象。

我知道我可能需要以某种方式使用 appplicationDomain.getDefinition。这不起作用:

var a = new ApplicationDomain(ApplicationDomain.currentDomain);
var foo: Class = a.getDefinition ( "com.me.CustomClass" ) ;
var f = new foo( ) ;
addChild ( f ) ;

TypeError:错误 #1007:尝试在非构造函数上进行实例化。

【问题讨论】:

    标签: flash actionscript-3 class instantiation


    【解决方案1】:

    看起来像一个应用程序域问题。加载的 swf 无法访问加载器中定义的类。

    您应该授予加载的 swf 对加载程序 swf 库的访问权限。尝试使用LoaderContext

    在我的头顶:

    var loader:Loader = new Loader();
    var ctx:LoaderContext = new LoaderContext(false,ApplicationDomain.current);
    loader.load(yourRequest,ctx);
    

    【讨论】:

    • 如果我在加载器中使用您的建议,那么从主库创建对象实例的代码是什么,从使用子 swf 编译的其他类调用?
    • 试试这个:var clazz:Class = loaderInfo.applicationDomain.getDefinition("ClassName") as Class; var instance:ClassName = new clazz();
    【解决方案2】:

    我发现这些答案有些过头了,因为我使用任何类的库项目所做的只是像任何标准导入一样导入它。当然,这就是我们选择 Export for Actionscript 的原因。

    例如:

    package 
    {
       import foo;                     // Library MovieClip
       import flash.display.MovieClip; // Must import MovieClip to Extend it.
       .......
    
       public class something extends MovieClip
       {
         private var _foo:foo;   // Create a local reference of the imported Library Item.
         ......
    
        public function something():void
        {
         _foo = new foo(); // Create a new instance of the imported Library Item.
         .........
        }
       }
      }  
    

    我发现这每次都有效,不能说它是否是正确的方法。但它对我有用。

    【讨论】:

    • 这在同一个 swf 中工作,但您不能这样做以从外部加载的 swf 中的类定义中实例化,这是发帖人所问的,基于他的澄清 cmets。跨度>
    【解决方案3】:

    我不记得这是个问题。我认为(已经有一段时间了!)您需要编写一个派生自 MovieClip 或类似的代码类,并在其属性中的某处与库项目相关联。当然,一旦完成,您就可以像对待任何其他类一样对待库类。

    编辑:

    试试这个:

    var foo:Class=loaderInstance.contentLoaderInfo.applicationDomain.getDefinition("MyClass");
    var x:*=new foo();
    

    仔细阅读您的问题后,我意识到这是加载器端的代码,而不是加载器端的代码。不过肯定是找对了树。

    【讨论】:

    • 是的,如果在加载程序中调用您的代码可以工作,但在这种情况下,我无论如何都可以在不使用 applicationDomain 的情况下访问该库。我想知道如何使用相同类型的调用,但在“loadee”(辅助加载的 swf)内。
    【解决方案4】:

    试试这样的:

    var foo:Class = ApplicationDomain.currentDomain.getDefinition("SymbolName") as Class;
    

    我认为符号名称不应该以包名开头,作为库符号。

    【讨论】:

    • ReferenceError:错误 #1065:未定义变量 CustomClass。我正在尝试从已加载的辅助 swf 访问该库。我需要访问父 swf 的库。
    猜你喜欢
    • 1970-01-01
    • 2012-06-14
    • 2011-03-29
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    相关资源
    最近更新 更多