AS3 - Доступ к элементам библиотеки вне класса Document - PullRequest
1 голос
/ 28 августа 2009

Как получить доступ к элементам библиотеки из классов, отличных от класса документа?

Например, если я создаю фрагмент ролика во Flash и экспортирую его для Actionscript с именем Foo, я могу сделать это в классе документа:

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: Предпринята попытка создания экземпляра для не-конструктора.

Ответы [ 4 ]

1 голос
/ 28 августа 2009

Похоже, проблема домена приложения. Загруженный SWF не может получить доступ к классам, определенным в загрузчике.

Вы должны предоставить загруженному SWF-файлу доступ к SWF-библиотеке загрузчика. Попробуйте использовать LoaderContext .

С макушки головы:

var loader:Loader = new Loader();
var ctx:LoaderContext = new LoaderContext(false,ApplicationDomain.current);
loader.load(yourRequest,ctx);
0 голосов
/ 12 апреля 2011

Я нахожу эти ответы несколько перегруженными, потому что все, что я когда-либо делал, чтобы использовать элемент библиотеки из любого класса, это импортировать его, как любой стандартный импорт. Конечно, именно поэтому мы выбираем Экспорт для 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.
     .........
    }
   }
  }  

Я считаю, что это работает каждый раз, не могу сказать, правильно ли это. но это работает для меня.

0 голосов
/ 28 августа 2009

Попробуйте что-нибудь еще подобное:

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

Я считаю, что имя символа не должно иметь имени пакета в начале, для символа библиотеки.

0 голосов
/ 28 августа 2009

Я никогда не помню, чтобы это было проблемой. Я думаю (это было давно!), Что вам нужно написать класс кода, производный от MovieClip или подобного, и связать его с элементом библиотеки где-нибудь в его свойствах. Конечно, как только это будет сделано, вы можете обращаться с классами библиотеки так же, как с любым другим классом.

EDIT:

попробуйте это:

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

При более внимательном прочтении вашей проблемы я понимаю, что это код на стороне загрузчика, а не на стороне загрузчика. Определенно лаять правильное дерево, хотя.

...