Базовый класс Actionscript в приложении Flex AIR - PullRequest
1 голос
/ 30 марта 2010

Я пытаюсь создать приложение Flex AIR с помощью Flex Builder 3, с которого я только начинаю.

В Flash CS4 в среде разработки есть текстовое поле, в котором вы можете указать класс, который станет «базовым» классом - ваш класс наследуется от Sprite, а затем «становится» рабочей областью во время выполнения. Есть ли способ сделать то же самое с Flex / AIR? В противном случае, кто-нибудь может объяснить, как создать и использовать внешний класс?

Первоначально у меня было это в TestApp.mxml:

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script source="TestApp.as"/>
</mx:WindowedApplication>

И это в TestApp.as:

package {
    public class TestApp {
        public function TestApp() {
            trace('Hello World');
        }
    }
}

Это выдает ошибку "пакеты не могут быть вложенными", поэтому я попытался удалить выражение пакета:

public class TestApp {
    public function TestApp() {
        trace('Hello World');
    }
}

Это выдает ошибку «классы не могут быть вложенными», поэтому я, наконец, сдался и попытался полностью исключить класс, полагая, что вместо этого я попытаюсь начать с набора функций:

function init() {
    trace('Hello World');
}

Но это дает ошибку: «Файл, найденный в исходном пути, должен иметь внешне видимое определение. Если определение в файле должно быть видимым извне, поместите определение в пакет».

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

Кто-нибудь знает, как это исправить? Если я не могу сделать пользовательский класс как базовый класс, есть ли способ, которым я мог бы просто иметь это как:

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script source="TestApp.as"/>
    <mx:Script>
        var app = new TestApp();
    </mx:Script>
</mx:WindowedApplication>

В настоящее время я вообще не могу импортировать определение класса, так что даже это не сработает.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 30 марта 2010

Файл mxml с именем TestApp.mxml в корне пути к классам создает класс TestApp в пакете по умолчанию.

Когда вы включаете скрипт, используя <mx:Script source="TestApp.as"/>, компилятор просто копирует содержимое файла TestApp.as в файл mxml как блок CDATA. Следовательно, пакеты / классы не могут быть вложенной ошибкой. Третья ошибка заключается в том, что файл сценария содержит то же имя, что и имя класса (компилятор знает, что существует класс TestApp, но в файле TestApp.as нет объявления класса). Если вы переименуете TestApp.as во что-то другое, например TestApp_script.as, и измените путь к файлу в теге <mx:Script/>, вам будет хорошо.

И, как уже предлагалось, всегда пишите ActionScript во встроенных блоках CDATA, а не во внешних файлах сценариев - это удобнее в обслуживании. В конце концов они оба (mxml и скрипт) являются частью одного класса и принадлежат одному и тому же файлу.

0 голосов
/ 30 марта 2010

Документ MXML фактически переводится в класс actionscript. Имя файла указывает имя класса, а корневой тег обозначает базовый класс. Таким образом, TestApp.mxml представляет «базовый» класс, который чаще всего называют классом документа .

Теперь, если вы хотите использовать свои собственные классы / mxml-компоненты в MXML, вам нужно будет импортировать пространство имен, в котором они находятся (подобно xmlns:mx="http://www.adobe.com/2006/mxml", импортирует компоненты flex), используя xmlns:c="mycomponents.*". Таким образом, если у вас есть собственный класс mycomponenty.Foo, вы можете использовать его следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:c="mycomponents.*" >
    <c:Foo />
</mx:WindowedApplication>

также я предлагаю вам привыкнуть встраивать встроенные скрипты в cdata.

...