Доступ к классу из загруженного извне Flex SWF - PullRequest
1 голос
/ 23 апреля 2011

Используя Flex 4, я создал SWF-файл со следующим кодом:

<fx:Script>
    <![CDATA[

        import mx.events.FlexEvent;
        import com.Index ;

        protected function start(event:FlexEvent):void
        {
            this.addElement (new Index());
        }
    ]]>

Я пытаюсь загрузить SWF-файл в другой SWF-файл и получить доступ к этому классу.,Проблема в том, что класс Flex - это то, что распознается загрузочным SWF.Я попытался получить доступ к его дочерним элементам (элементам), но добавленного элемента там нет.

Моя конечная цель - загрузить SWF-файл, имеющий объект, который может взаимодействовать с загрузочным SWF-файлом.

Ли

Дополнение:

Спасибо за ваше добавление.Код работает сейчас, но он имеет доступ только к классу Flex, созданному MXML.Вот полный MXML:

<?xml version="1.0" encoding="utf-8"?>

           width="1000"
           height="700"
           creationComplete="start(event)"
           >

<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>

<fx:Script>
    <![CDATA[

        import mx.events.FlexEvent;
        import Test;

        protected function start(event:FlexEvent):void
        {
            this.addElement(new Test ());
        }
    ]]>

Чтобы попытаться извлечь класс Test, я сделал следующее:

var MainC:Class = L.contentLoaderInfo .applicationDomain .getDefinition ("Main.Test") as Class;
        var O:Object = new MainC();

Возвращает 'Ошибка # 1065: переменная Test не определена.'

Я получаю тот же результат, если использую ... getDefinition ("Test").

Если я использую .... getDefinition ("Main"), он работает нормально.Но я не могу достичь класса, который он создает, чтобы извлечь что-либо.

lee

1 Ответ

3 голосов
/ 23 апреля 2011

Лучший способ - использовать этот SWF в качестве библиотеки (SWC) и связать его с вашим проектом. Таким образом вы сможете добиться строгой типизации и получить доступ к базовым классам.

Если у вас нет доступа ни к выпуску библиотеки объекта swf, ни к ее источнику для сборки библиотеки swc yourserlf, вы все равно можете использовать внешние классы, но не с строгой типизацией:

var ExtIndex : Class = loader.contentLoaderInfo.applicationDomain.getDefintiion("Index");
var instance : Object = new ExtIndex();
this.addElement(instance);

, поэтому вы должны определить instance как объект.

Хотя, если класс Index в вашем SWF-файле реализует interface, о котором вы знаете (у вас он есть в вашем проекте), например I_Index, вы можете использовать его вместо Object:

var instance : I_Index = new ExtIndex();
this.addElement(instance);

Вы также можете найти эту статью полезной при принятии решения, по какому пути идти.

Обновление 1

Объявление loader в Flex:

var loader: flash.display.Loader;
[...]
var ExtIndex: Class = loader.contentLoaderInfo.applicationDomain.
    getDefinition("your.package.Index") as Class;

Если у вас есть класс Index в пакете (отличный от стандартного), вы должны указать его в его имени. Приведенный выше код ищет класс Index внутри пакета your/package.

Документы API для getDefinition:

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

Параметры:
name Название определения.
Возвращает : объект, связанный с определением.
Броски : ReferenceError - Публичное определение с указанным именем не существует.

Языковая версия: 3.0
Версия проигрывателя: Flash 9, AIR 1.0

Обновление 2
Чтобы сделать класс Test, определенный в вашем внешнем приложении, доступным из других приложений Flex, загрузив содержащий его SWF-файл, вы должны иметь переменную, объявленную с этим типом, в основном приложении вашего SWF-файла. В противном случае этот класс не будет скомпилирован в swf (чтобы сохранить его размер).
Flex только компилирует классы, которые фактически используются, в swf, поэтому недостаточно просто импортировать класс.
В Основное приложение вашего SWF вы должны объявить:

var _tmp:Index;

Это гарантирует, что класс Index будет скомпилирован в ваш swf, и вы можете получить к нему доступ из другого приложения, которое загружает этот swf.

Обновление 3
Вы можете проверить, как это работает на по этой ссылке . Исходный код тоже включен.

Поскольку существует два проекта, в папке [src] вы можете увидеть исходный текст теста, а в папке [source path src] - источник загруженного извне файла swf.
Если вы загружаете весь проект, убедитесь, что вы разделили два проекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...