简单配置
再视图中可以这样声明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!' ); } } }