Разделение MXML и Actionscript

Из этого урока http://www.brighthub.com/internet/web-development/articles/11010.aspx Я нашел код ниже. Есть ли способ прервать это, поэтому файл mxml имеет только mxml, а код между тегами script помещен в файл ActionScript?

Спасибо.

-Nick

<mx:Application
    xmlns:mx="http://www.adobe.com/2006/mxml"
    layout="absolute"
    width="600"
    height="400"
    frameRate="100"
    creationComplete="CreationComplete()"
    enterFrame="EnterFrame(event)">
    <mx:Script><![CDATA[
        public function CreationComplete():void
        {

        }

        public function EnterFrame(event:Event):void
        {

        }
    ]]></mx:Script>
</mx:Application>

Ответ 1

В Flex существует несколько способов достижения этой цели:

  • Поместите код AS в файл .as и используйте атрибут "source = yourfile.as" в теге Script:

<mx:Script source="yourfile.as" />

Вы также можете использовать объявление includes="yourfile.as" w/в теге Script:

<mx:Script
    <![CDATA[
        include "yourfile.as";

        //Other functions
    ]]>
</mx:Script>

  • Используйте шаблон Code-Behind, в котором вы определяете код в AS файле, который расширяет визуальный компонент, который вы хотите продлить ваш файл MXML. Затем ваш файл MXML просто расширяет AS файл, и у вас есть (через наследование) доступ ко всему коду. Это будет выглядеть примерно так (я не уверен, что это будет работать для основного файла MXML, который расширяет Application):

AS File:

package {
    public class MainAppClass {
        //Your imports here
        public function CreationComplete():void {
        }
        public function EnterFrame(event:Event):void {
        }
    }
}

Файл MXML:

<component:MainAppClass xmlns:component="your namespace here"
                        xmlns:mx="http://www.adobe.com/2006/mxml"
                        layout="absolute"
                        width="600"
                        height="400"
                        frameRate="100"
                        creationComplete="CreationComplete()"
                        enterFrame="EnterFrame(event)">
</component:MainAppClass>

  • Используйте фреймворк для ввода функциональности, которую вы ищете, в качестве типа "модели", которая содержит функциональные возможности данных, которые вы будете использовать. Это выглядело бы так в Петрушке:

        <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
                layout="absolute"
                width="600"
                height="400"
                frameRate="100"
                creationComplete="model.CreationComplete()"
                enterFrame="model.EnterFrame(event)">
    
                <mx:Script>
                    <![CDATA[
                        [Inject]
                        [Bindable]
                        public var model:YourModelClass;
                    ]]>
               </mx:Script>
       </mx:Application>
    

Две структуры, которые приходят на ум, которые могут помочь в/инъекции, - Mate или Петрушка.


Я не уверен, работает ли шаблон кода с основным файлом MXML (который расширяет приложение), поэтому, если у вас возникли проблемы, вы можете попробовать разбить содержимое в главном файле MXML на отдельный компонент который включен в Main. Это может выглядеть примерно так:

Main.mxml:

<mx:Application blah,blah,blah>
    <component:YourComponent />
</mx:Application>

YourComponent.mxml:

<component:YourComponentCodeBehind creationComplete="model.creationComplete()"...>
  //Whatever MXML content you would have put in the Main file, put in here
</component:YourComponentCodeBehind>

YourComponentCodeBehind.as

package {
    class YourComponentCodeBehind {
        //Whatever AS content you would have put in the Main .as file, put in here
    }
}

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

Надеюсь, что это имеет смысл:)