Swiz-快速上手

简单配置

再视图中可以这样声明swiz:定义BeanProvider和一些配置属性

<s:Application
    xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"
    xmlns:view="org.swizframework.quickswiz.view.*" xmlns:config="org.swizframework.quickswiz.config.*"
    xmlns:swiz="http://swiz.swizframework.org">
 
    <fx:Declarations>
        <swiz:Swiz>
 
            <!-- 可以直接在beanProviders中定义bean,也可以定义非视图的bean组件 -->
            <swiz:beanProviders>
                <config:Beans />
            </swiz:beanProviders>
 
            <swiz:loggingTargets>
                        <swiz:SwizTraceTarget id="myTraceTarget" />
                    </swiz:loggingTargets>
 
            <swiz:config>
                <!-- The eventPackages 是事件类的包路径,and viewPackages 可选择项,是视图组件的包路径. -->
                <swiz:SwizConfig
                    eventPackages="org.swizframework.quickswiz.event.*"
                    viewPackages="org.swizframework.quickswiz.view.*" />
            </swiz:config>
 
        </swiz:Swiz>
    </fx:Declarations>
     
    <s:layout>
        <s:VerticalLayout horizontalAlign="center" paddingTop="20" />
    </s:layout>
     
    <view:UserForm id="userForm" />
 
</s:Application>

非视图组件可以这样声明swiz

<swiz:BeanProvider
    xmlns:swiz="http://swiz.swizframework.org" xmlns:service="org.swizframework.quickswiz.service.*"
    xmlns:controller="org.swizframework.quickswiz.controller.*">
 
    <service:UserService id="userService"/>
    <controller:UserController id="userController"/>
 
    <!-- 通过servicehelper 与服务端 -->
    <swiz:ServiceHelper id="serviceHelper" />
 
</swiz:BeanProvider>

依赖注入,事件控制,服务端交互

通过[Inject]标识 依赖注入

package org.swizframework.quickswiz.controller
{
    import org.swizframework.quickswiz.model.User;
    import org.swizframework.quickswiz.service.UserService;
     
    public class UserController
    {  
        [Inject]
        public var userService : UserService;  
         
        [Bindable]
        public var currentUser : User;
    }
}

不仅可以注入一个类,还以注入类中自己的属性。下面的UserForm没有必要在BeanProvider中声明。因为先前已经在配置里面定义了视图的包路径,所以swiz会自动扫描处理注释。

<s:Panel
    xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"
    xmlns:mx="library://ns.adobe.com/flex/mx">
     
    <fx:Script>
        <![CDATA[
            import org.swizframework.quickswiz.event.UserEvent;
            import org.swizframework.quickswiz.model.User;
             
            [Bindable]
            [Inject( source="userController.currentUser", bind="true" )]
            /**
             * 既可以注入整个controller实例,也可以注入controller实例中的currentUser属性
             */
            public var user : User;
        ]]>
    </fx:Script>
     
    <mx:Form>
        <mx:Text id="userId" text="{isNaN( user.id ) ? 'N/A' : user.id}" />
        <s:TextInput id="firstName" text="{user.firstName}" />
        <s:TextInput id="lastName" text="{user.lastName}" />
        <s:TextInput id="email" text="{user.email}" />
        <s:Button label="Save" />
    </mx:Form>
     
</s:Panel>

派发和处理事件

<s:Panel
    xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"
    xmlns:mx="library://ns.adobe.com/flex/mx">
     
    <fx:Script>
        <![CDATA[
            import org.swizframework.quickswiz.event.UserEvent;
            import org.swizframework.quickswiz.model.User;
             
            [Bindable]
            [Inject( source="userController.currentUser", bind="true" )]
            /**
             * We could inject the whole controller instance, but we only need
             * one property from the controller, the current user, so we just
             * inject that property.
             */
            public var user : User;
             
            /**
             * 这里派发的是一个标准的Flex事件,不是swiz特有的。
             */
            private function saveUser() : void
            {
                user.firstName = firstName.text;
                user.lastName = lastName.text;
                user.email = email.text;
                var event : UserEvent = new UserEvent( UserEvent.SAVE_USER_REQUESTED );
                event.user = user;
                dispatchEvent( event );
            }
             
        ]]>
    </fx:Script>
     
    <mx:Form>
        <mx:Text id="userId" text="{isNaN( user.id ) ? 'N/A' : user.id}" />
        <s:TextInput id="firstName" text="{user.firstName}" />
        <s:TextInput id="lastName" text="{user.lastName}" />
        <s:TextInput id="email" text="{user.email}" />
        <s:Button label="Save" click="saveUser()" />
    </mx:Form>
     
</s:Panel>

UserEvent的代码,唯一注意的是把bubbles设置为true,才可以让swiz捕获。在下面的例子中,controller中添加了一个事件处理方法。

package org.swizframework.quickswiz.event
{
    import org.swizframework.quickswiz.model.User;
    import flash.events.Event;
     
    public class UserEvent extends Event
    {
        public static const SAVE_USER_REQUESTED : String = "saveUser";
        public var user : User;
         
        /**
         * This is just a normal Flex event. The only thing to note is that we set 'bubbles' to true,
         * so that the event will bubble up the display list, allowing Swiz to listen for your events.
         */
        public function UserEvent( type:String )
        {
            super( type, true );
        }
    }
}

上面知道了如何派发事件,下面看下如何处理事件。swiz提供了[EventHandle]的注释。当有UserEvent.SAVE_USER_REQUESTED类型的事件发生时,swiz会自动调用controller中的saveuser的方法,并且会把user当做参数传入

package org.swizframework.quickswiz.controller
{
    import org.swizframework.quickswiz.model.User;
    import org.swizframework.quickswiz.service.UserService;
     
    public class UserController
    {
        [Inject]
        public var userService : UserService;
         
        [Bindable]
        public var currentUser : User;
         
        [PostConstruct]
        /**
         * [PostConstruct] 注释是表示所有依赖都注入完成后调用的方法。
         * 这个例子表示所有依赖注入完成后会new user的实例
         */
        public function createDefaultUser() : void
        {
            currentUser = new User();
        }
         
        [EventHandler( event="UserEvent.SAVE_USER_REQUESTED", properties="user" )]
        /**
         * Perform a server request to save the user
         */
        public function saveUser( user : User ) : void
        {
            // TODO: Add server interaction
        }
         
    }
}

当非视图组件例如controller和service派发事件时,应该怎么做?swiz提供[Dispatcher]注释使用。

package org.swizframework.quickswiz.service
{
    import org.swizframework.quickswiz.model.User;
    import flash.events.IEventDispatcher;
    import mx.rpc.AsyncToken;
     
    import org.swizframework.utils.services.MockDelegateHelper;
 
    public class UserService
    {
        [Dispatcher]
        /**
         * 通过[Dispatcher]注入一个事件派发器.
         * 通过派发器触发相关的 [EventHandler].
         */
        public var dispatcher : IEventDispatcher;
 
        /**
         * 避免与服务器的依赖 我们可以使用 Swiz helper class 创建一个模拟的AsyncTokens
         */
        private var mockHelper : MockDelegateHelper;
         
        public function UserService()
        {
            mockHelper = new MockDelegateHelper();
        }
         
        /**
         * 一般在应用中,我们需要调用 RemoteObject, HTTPService, etc.
         */
        public function saveUser( user : User ) : AsyncToken
        {
            user.id = Math.round( Math.random() * 100 );
            return mockHelper.createMockResult( user );
        }
    }
}

与服务器交互

现在controller可以相应保存user的事件了,最后一步就是请求后台服务器包user保存到数据库中。一般来说是自己构造请求,并处理ResultEvent和FaulEvent事件。Swiz可以简化这些流程。下面的controller中你可以看到Swiz自己的类 ServiceHelper已经注入,可以调用executeServiceCall方法该方法将自动获得AsyncToken RPC调用和创建响应者对象。下面即调用userService中的saveUser方法

package org.swizframework.quickswiz.controller
{
    import org.swizframework.quickswiz.model.User;
    import org.swizframework.quickswiz.service.UserService;
    import mx.controls.Alert;
    import mx.rpc.events.ResultEvent;  
    import org.swizframework.utils.services.ServiceHelper;
     
    public class UserController
    {
        [Inject]
        public var userService : UserService;
 
        [Inject]
        public var serviceHelper : ServiceHelper;
                 
        [Bindable]
        public var currentUser : User;
         
        [PostConstruct]
        /**
         * [PostConstruct] methods are invoked after all dependencies are injected.
         * In this example, we set up a default user after the bean is created.
         */
        public function createDefaultUser() : void
        {
            currentUser = new User();
        }
         
        [EventHandler( event="UserEvent.SAVE_USER_REQUESTED", properties="user" )]
        /**
         * Perform a server request to save the user
         */
        public function saveUser( user : User ) : void
        {
            serviceHelper.executeServiceCall( userService.saveUser( user ), handleSaveUserResult );// handleSaveUserResult 是成功请求后的回调函数
        }
         
        /**
         * Handle the server call result
         */
        private function handleSaveUserResult( event : ResultEvent ) : void
        {
            // Show an Alert just to make it obvious that the save was successful.
            Alert.show( 'User saved successfully!' );
        }
         
    }
}






你可能感兴趣的:(Swiz)