Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   ApplicationDomain. Во флэшку подгружаются две других. Как разделить одинаковые имена. (http://www.flasher.ru/forum/showthread.php?t=111904)

terbooter 12.05.2008 14:23

ApplicationDomain. Во флэшку подгружаются две других. Как разделить одинаковые имена.
 
Есть флешка "лоадер". Она подгружает в себя две других (skin1 и skin2);
Во флешках skin есть мувики в либе с одинаковыми именами классов (но выглядят они по-разному).
Флэшки skin гружу так:
skin1
Код:

this.skinLoader = new Loader();
            var loaderContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
            var url:String = this.flashVars.skinUrl;
            var myUrlRequest:URLRequest = new URLRequest(url);
            skinLoader.load(myUrlRequest, loaderContext);
skinLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);

skin2
Код:

this.skinLoader_x2 = new Loader();
            var url_x2:String = this.flashVars.skinUrl_x2;
            var myUrlRequest_x2:URLRequest = new URLRequest(url_x2);
            skinLoader_x2.load(myUrlRequest_x2);
skinLoader_x2.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete_x2);

По событию 'окончание загрузки' получаю два разных applicationDomain-a
Код:

private function onLoadComplete(e:Event):void {
           
            this.applicationDomain = e.target.applicationDomain;
            //switchToNormalMode();           
           
        }
private function onLoadComplete_x2(e:Event):void {
           
            this.applicationDomain_x2 = e.target.applicationDomain;
            //switchToDoubleMode();           
           
        }

Дальше добавляю мувики на сцену
Код:

//1
var className="exportedMCName";
var currClass:Class=(applicationDomain.getDefinition(className) as Class);
addChild(new currentClass);

//2
var className="exportedMCName";
var currClass:Class=(applicationDomain_x2.getDefinition(className) as Class);
addChild(new currentClass);

Во втром случае добавляется мувик из флешки skin1
Если в skin1 нет мувика с таким именем, то только тогда добавляется из skin2

etc 12.05.2008 14:28

Эта строка говорит сама за себя:
Код:

new LoaderContext(false, ApplicationDomain.currentDomain);

terbooter 12.05.2008 14:56

Ну так и задумано, чтобы слить аппликэйшен домены лоадера и скин1,
а аппликэшен домен скин2 оставить отдельно.
Тем не менее скин1 и скин2 грузятся в разные аппликейшен домены.

То что они разные проверяю так:
Создаю мувики с уникальными именами и проверяю через hasDefinition()

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

В хелпе написано что вообще возможна ситуация с перекрыванием без сообщения об ошибке, но это невозможно когда обращение происходит явно к конкретному аппликэшен домену через getDefinition()

Вечером постараюсь выложить пример, чтобы было понятнее о чем я говорю

etc 12.05.2008 15:09

Цитата:

Сообщение от terbooter (Сообщение 738669)
Тем не менее скин1 и скин2 грузятся в разные аппликейшен домены.

currentDomain говорит об обратном.
Однажды определенный класс в одном домене, не будет переопределен другим классом из флешки, которая подгружается в тот же домен.
Чтобы добиться требуемого, надо в контексте указать новый домен, а не текущий.

terbooter 12.05.2008 15:59

Ага.
Моя ошибка что я думаю что гружу в разные домены
Код:

this.skinLoader_x2 = new Loader();
                        var currentAppDomain:ApplicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
                        var loaderContext:LoaderContext = new LoaderContext(false, currentAppDomain);
                        var url_x2:String = this.flashVars.skinUrl_x2;
                        var myUrlRequest_x2:URLRequest = new URLRequest(url_x2);
                        skinLoader_x2.load(myUrlRequest_x2, loaderContext);                       
                       
                        skinLoader_x2.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete_x2);
private function onLoadComplete_x2(e:Event):void {
               
        trace(this.skinLoader_x2.contentLoaderInfo.sameDomain);// Why true?
       
}


etc 12.05.2008 16:03

Потому что parentDomain указан. Объявленный класс в родительском домене тоже не переопределяется.

terbooter 12.05.2008 16:11

Код:

this.skinLoader_x2 = new Loader();
var currentAppDomain:ApplicationDomain = new ApplicationDomain(null);
var loaderContext:LoaderContext = new LoaderContext(false, currentAppDomain);
var url_x2:String = this.flashVars.skinUrl_x2;
var myUrlRequest_x2:URLRequest = new URLRequest(url_x2);
skinLoader_x2.load(myUrlRequest_x2, loaderContext);                       
       
skinLoader_x2.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete_x2);

private function onLoadComplete_x2(e:Event):void {
               
        trace(this.skinLoader_x2.contentLoaderInfo.sameDomain);// Why true?
       
}

Но тут то явно должны быть разные?

*Пойду в аптеку... за ядом*

etc 12.05.2008 16:35

sameDomain относится не к ApplicationDomain, а к домену, с которого загружена флешка. В данном случае, у обеих localhost.

terbooter 12.05.2008 16:53

Ок, с sameDomain погорячился, но вот это:
Код:

trace((this.applicationDomain == this.applicationDomain_x2)); // true

etc 12.05.2008 17:19

А что есть this.applicationDomain?


Часовой пояс GMT +4, время: 23:07.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.