Как стать автором
Обновить

Swiz Framework (простейшее приложение)

Время на прочтение3 мин
Количество просмотров735
Предыдущий мой пост:Swiz Framework (краткий обзор)

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


Итак самая простая диаграмма работы Flex приложения с использованием Swiz выглядит следующим образом:
image
View(или Presentation model) диспатчит событие, которое с помощью мета-тега [Mediate(event="someEvent")] отлавливается Controller, далее контроллер вызывает сервис и меняет модель. Вид только отражает изменения в модели.

Инжектинг


Для того что бы понять что во что инъецируется можно посмотреть на схему:
image
Модель инжектится в вид и контроллер. Соотвественно вид отображает модель, контроллер ее обновляет. Так же сервисы инжектятся в делегат, а делегат в свою очередь инжектится в контроллер.

Составляющие


Основное приложение SwizQuickstart.mxml включает в себя компонент Swiz у которого указывается beanProviders и config, а так же вид UserForm
<fx:Declarations>
	<swiz:Swiz>	
		<swiz:beanProviders>
			<config:Beans />
		</swiz:beanProviders>
			
		<swiz:config>
			<swiz:SwizConfig 
				eventPackages="org.swizframework.quickswiz.event.*" 
				viewPackages="org.swizframework.quickswiz.view.*" />
		</swiz:config>
	</swiz:Swiz>
</fx:Declarations>

<view:UserForm id="userForm" />

Разберем все состовляющие по порядку

SwizConfig

Этим классом конфигурируеться весь фреймворк. Выглядит он следующим образом:
<swiz:SwizConfig
	setUpEventType="{ Event.ADDED_TO_STAGE }" 
	setUpEventPhase="{ EventPhase.CAPTURING_PHASE }" 
	setUpEventPriority="50"
	tearDownEventType="{ Event.REMOVED_FROM_STAGE }" 
	tearDownEventPhase="{ EventPhase.CAPTURING_PHASE }" 
	tearDownEventPriority="50"
	eventPackages="com.foo.events, org.bar.events"
	validateEventTypes="true"
	viewPackages="com.foo.views, org.bar.events"
	defaultFaultHandler="handleUnhandledFaults"
	defaultDispatcher="global" />


Beans

В beanProviders указываються контроллеры, модели, сервисы, делегаты которые нужно включать. В процессе обработки этих классов в них находяться все мета теги и происходят все внутренние процессы. Класс <config:Beans /> выглядит следующим образом:
<swiz:BeanProvider 
	xmlns:fx="http://ns.adobe.com/mxml/2009"
	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"/>
	
	<!-- We'll use the Swiz ServiceHelper to help simulate a server-side call. -->
	<swiz:ServiceHelper id="serviceHelper" />

</swiz:BeanProvider>

Соотвественно после обработки Beans Swiz уже знает что у нас есть сервисы и контроллеры.

UserForm

Представляет из себя простой mxml, самое интересное там это инжектинг:
[Bindable]
[Inject( source="userController.currentUser", bind="true" )]
public var user : User;

Далее в любых местах можно использовать нашу модель user, например для отображения:
<s:TextInput id="firstName" text="{user.firstName}" />

Как это все работает:


Вид отображает то что он получил из модели.
<s:TextInput id="firstName" text="{user.firstName}" />

Далее пользователь правит любые данные, и нажимает кнопку сохранить.
<s:Button label="Save" click="saveUser()" />

Диспатчиться событие
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 );


Событие отлавливаеться в контроллере, и вызывает сервис. Команда userService.saveUser( user ) возвращает AsyncToken. Это соотвественно может быть любой делегат и любой вызов который возвращает AsyncToken.
[Mediate( event="UserEvent.SAVE_USER_REQUESTED", properties="user" )]
public function saveUser( user : User ) : void
{
	serviceHelper.executeServiceCall( userService.saveUser( user ), handleSaveUserResult );
}


После того как AsyncToken отдиспатчит событие result выполниться функция handleSaveUserResult
private function handleSaveUserResult( event : ResultEvent ) : void
{
	Alert.show( 'User saved successfully!' );
}

В этом месте мы могли бы соотвественно поменять модель или отдиспатчить какое либо событие которое так же успешно могло быть отловленно с помошью тега [Mediate] в любом контроллере или презентационной модели.

В следующих постах я разберу как работает более комплексное приложение на основе Swiz, а так же детально распишу свойства Swiz классов.
Теги:
Хабы:
Всего голосов 6: ↑3 и ↓30
Комментарии3

Публикации