Какая лучшая практика для включения внешних файлов ActionScript в гибкое приложение

Если я включу внешний файл ActionScript в файл flex mxml, я получу разное поведение во время компиляции в зависимости от используемого метода. Использование тега сценария mx с атрибутом источника или инструкцией include, затем компиляция файла дает такие ошибки, как:

Ошибка: пакеты не могут быть вложены.

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

    import lib.journal;
    public var testing:journal = new journal();
    testing.init();

который дает:

Ошибка: доступ к неопределенному тестированию свойств.

Кто-нибудь может объяснить, что здесь происходит? Какое влияние на пакеты и область видимости оказывает включение файла по сравнению с его импортом?

Благодарность,


person codecowboy    schedule 21.02.2009    source источник


Ответы (3)


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

А затем для более конкретной проблемы, которая, похоже, у вас есть: вы, вероятно, пытаетесь выполнить testing.init(); прямо в блоке <script> - попробуйте поместить его в метод. У вас должны быть только такие вещи, как операторы import и объявления членов (переменные, функции) непосредственно в блоке сценария, а такие операторы - внутри функций.

Вы видите это сообщение об ошибке, потому что когда вы вызываете метод init() этого объекта, он еще не был создан - этот оператор будет выполнен, когда будет загружено определение класса, который представляет ваш файл MXML; вы хотите, чтобы он выполнялся, когда был создан конкретный экземпляр этого класса, и вы можете сделать это, вызвав его в конструкторе класса (это, насколько я знаю, невозможно, когда вы пишете класс, использующий MXML, так что читайте дальше :) или, например, в функции обработчика для события FlexEvent.CREATION_COMPLETE (или creationComplete с точки зрения атрибутов тега MXML) (см. пример ниже).

Попробуйте что-то вроде этого:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application 
    xmlns:mx="http://www.adobe.com/2006/mxml"
    width="800" height="600"
    creationComplete="creationCompleteHandler();"
>
    <mx:Script>
        <![CDATA[

        import lib.Journal;

        public var testing:Journal = new Journal();

        private function creationCompleteHandler():void
        {
            testing.init();
        }

        ]]>
    </mx:Script>

</mx:Application>
person hasseg    schedule 21.02.2009
comment
благодаря. это имеет больше смысла. Однако теперь я получаю сообщение об ошибке: вызов, возможно, неопределенного метода инициализации через ссылку со статическим журналом типа. - person codecowboy; 21.02.2009
comment
убедитесь, что в вашем классе Journal есть общедоступная функция с этим именем и что она сохранена в файле с именем Journal.as по пути project-root / lib / (где project-root - это путь к корню структуры каталогов вашего проекта) - person hasseg; 21.02.2009
comment
Кроме того, если перед использованием всегда необходимо вызывать init (), вы можете вместо этого выполнить инициализацию в конструкторе класса Journal. - person ianmjones; 24.02.2009

Импорт позволяет получить доступ к публичным объявлениям импортированного файла.

Включить помещает содержимое файла as3 в место включения , как если бы вы ввели его там.

См. Руководство по «Сравнение, включение и импорт ActionScript. код ".

person Assaf Lavie    schedule 21.02.2009
comment
Спасибо за ответ, но это не ответ на мой вопрос. Я уже несколько раз просматривал ссылку, которую вы разместили. Что-то не так в приведенном выше коде? Почему я получаю эти ошибки? - person codecowboy; 21.02.2009

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

<mx:Script>
    <![CDATA[

    import lib.Journal;

    public var testing:Journal;

    private function creationCompleteHandler():void
    {
        testing = new Journal();
    }

    ]]>
</mx:Script>

Ура, Дирк

person Community    schedule 22.07.2009