суббота, 29 ноября 2008 г.

Часть 2. Старт с Cairngorm. Использование Model Locator для управления Видами.

Куски кода съедены парсером, советую обратиться к первоисточникам (перевод с англ.:Getting Started with Cairngorm – Part 2. Using a ModelLocator to Manage the View )

Резюме: В первой части я рассказывал о базовом устройстве и использовании паттерна Model Locator. Этот паттерн один из многих, используемых в микроархитектуре Cairngorm. Он будет использоваться и во второй части, поэтому предполагается что вы знакомы с ним, или обратиться к 1 части для ознакомления. На данный момент мы еще не работали с "полным" Cairngorm (это произойдет в 3 части).

Как и все статьи этой серии, урок состоит из двух частей. В этой статье вы узнаете всю теорию этой темы, а потом на видео вы сможете со мной попрограммировать. Эта статья содержит инструкции, как настроить проект для нашего совместного творчества.

На предыдущем уроке мы узнали о преимуществах использования ModelLocator для управления данными в рамках приложения. Однако преимущество паттерна этим не исчерпывается. Он может управлять Видами в приложении. Чтобы понять, как это происходит, вам нужно создать создать новый проект "ViewManager" с главным файлом "Main.mxml". Также будет нужно добавить Cairngorn.swc к проекту и создать новые папки - view и model. Когда вы закончите, проект должен будет выглядеть следующим образом:



Теперь, вам необходимо взять код ModelLocator из предыдущего урока и разместить внутри нашего приложения. Я размещаю этот код здесь для вашего удобства

Actionscript:
package model {
import com.adobe.cairngorm.model.IModelLocator;
[Bindable]
public class ViewModelLocator implements IModelLocator {
// Single Instance of Our ModelLocator
private static var instance:ViewModelLocator;
public function ViewModelLocator(enforcer:SingletonEnforcer) {
if (enforcer == null) {
throw new Error( "You Can Only Have One ViewModelLocator" );
}
}
// Returns the Single Instance
public static function getInstance() : ViewModelLocator {
if (instance == null) {
instance = new ViewModelLocator( new SingletonEnforcer );
}
return instance;
}
//DEFINE YOUR VARIABLES HERE
}
}
// Utility Class to Deny Access to Constructor
class SingletonEnforcer {}

Если вам нужна подробная информация о ModelLocator, вернитесь к 1 части руководства.

Единственно, что должно быть исправлено в ModelLocator - это определение пэкаджа. ModelLocator этого проекта мы будем размещать в папке "model", соответсвенно в объявлении пэкаджа должно быть слово "model" (это уже исправлено в листинге выше). Также необходимо добавить еще одну публичную переменную "workflowState" типа "uint". Объявление будет выглядеть следующим образом:

Actionscript:
public var workflowState:uint = 0;

Эта переменная будет использоваться для "управления" вида вашего приложения. Наиболее распространенным способом для этого является использование ViewStack. Если вы с ним не знакомы, почитайте о нем здесь. В частности о свойстве selectedIndex компонента ViewStack. Это числовое значения определяет видимого во ViewStack потомка. Рассмотрим следующий код:

mxml:












По умолчанию selectedIndex равен 0 и отображается box1. Если вы исполните команду:

ActionScript:
myViewStack.selectedIndex = 1;

то будет виден box2. Если применить ModelLocator, можно использовать переменную workflowState для установки selectedIndex. Используя значение workflowState для selectedIndex, можно получить полный контроль за тем, что отображается во ViewStack вашего ModelLocator.

mxml:

...


Определение констант для улучшения кода

Конечно с помощью этого метода легко управлять приложением, однако он может привести к путанице в коде. Например предположим что у нас есть следующее:
1. ViewStack с двумя потомками: LoginScreen и WelcomeScreen
2. Свойство selectedIndex у ViewStack'a управляется свойством workflowState
3. Кнопка "Login" определяет действие myViewStack.selectedIndex = 1;

Может показаться что это будет работать корректно и нет нужды в каких-либо изменениях. Попробуйте добавить во ViewStack еще одного потомка и он может нарушить порядок. Иногда бывает необходимо вручную установить свойство selectedIndex. Для этого просто нужно определить константы внутри ModelLocator.

ActionScript:
//DEFINE YOUR VARIABLES HERE
public var workflowState:uint = 0;
// DEFINE VIEW CONSTANTS
public static const LOGIN_SCREEN = 0;
public static const WELCOME_SCREEN = 1;

Используя данный метод, вым нужно будет только изменить значение в одном месте, если изменится число потомков у ViewStack. Теперь мы назначим кнопке Login событие следующим образом:

ActionScript:
myViewStack.selectedIndex = ViewModelLocator.WELCOME_SCREEN;

Вы не только защитили код от будущих изменений, но также сделали его более логичным. Другим разработчикам будет легче понять процесс без просмотра потомков ViewStack.

Видеопример
http://www.davidtucker.net/swf/flv/cairngorm2.flv

Исходники урока
http://www.davidtucker.net/airtips/ViewManager.zip

Комментариев нет: