[tradução] Iniciando com o Cairngorm, parte 2
Recapitulando: Na Parte 1, discuti a implementação básica e o uso do padrão Model Locator. Este padrão é um dos muitos padrões de projeto contidos no Cairngorm (micro-arquitetura). O Model Locator será usado também na Parte 2, então, assumo que você está familiarizado com os conceitos apresentados na Parte 1 deste tutorial. Neste momento, não trabalharemos ainda com uma completa aplicação do Cairngorm, o que será feito na parte 3.
Parte 2 – Usando o Model Locator para gerenciar a camada View
No tutorial anterior você aprendeu as vantagens da utilização do Model Locator para gerenciar dados na aplicação, contudo, a vantagem do ModelLocator vai além do gerenciamento de dados. Pode também gerenciar a camada view de uma aplicação. Para entender como o gerenciamento da view se comporta no Cairngorm, você precisa primeiro criar um projeto chamado ViewManager e nomear a aplicação principal como Main.mxml. Para este projeto, você também precisará adiciona o swc do Cairngorm (Cairngorm.swc) no seu BuildPath (como descrito na Parte 1). Também será necessário criar duas pastas dentro da pasta src: view e model. Quando estiver completo, seu projeto se parecerá com a imagem 1, abaixo:

Em seguida, precisaremos pegar o código do ModelLocator do tutorial anterior e colocar na aplicação. O código está abaixo para sua conveniência.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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 {} |
Exemplo 1 – O ModelLocator da Parte 1
Se você precisar de informações sobre o ModelLocator, por favor retorne à Parte 1 deste tutorial.
O único item a ser modificado no ModelLocator é o Package. Para este projeto, você colocará o ModelLocator na pasta model, então, o caminho do package apenas precisa ser model (package.model, o que já foi feito acima). Também será necessário adicionar uma variável ao ModelLocator. Esta variável se chamará worflowstate e será do tipo uint. A declaração será assim:
1 | public var workflowState:uint = 0; |
Exemplo 2 - Definindo a variável workflowState
Esta variável será usada para controlar a camada view da sua aplicação. A forma mais comum de aplicar este método é usar um ViewStack. Se você não é familiarizado com o ViewStack, leia antes esta informação. Um ViewStack possui uma propriedade chamada selectedIndex. Este valor numerico define qual filho é visível dentro do ViewStack. Considere o seguinte código:
1 2 3 4 5 6 7 8 9 10 11 | <mx:ViewStack id="myViewStack"> <mx:HBox id="box1"> <mx:Label text="I am Box 1" /> </mx:HBox> <mx:HBox id="box2"> <mx:Label text="I am Box 2" /> </mx:HBox> <mx:HBox id="box3"> <mx:Label text="I am Box 3" /> </mx:HBox> </mx:ViewStack> |
Exemplo 3 – Um exemplo básico de ViewStack
Inicialmente o valor do selectedIndex é 0 (zero). Com isso, o box1 deve ser visível mas não os demais. Se você inserir o seguinte comando:
1 | myViewStack.selectedIndex = 1; |
Exemplo 4 – Setando manualmente o selectedIndex
então o box chamado box2 será visível. Contudo, se você aplicar o ModelLocator a este conceito, você deverá usar a variável workflowState para setar a propriedade selectedIndex. Associando o selectedIndex ao valor de workflowState, você terá controle completo sobre o que será visível dentro do ViewStack, a partir do seu ModelLocator.
1 2 3 | <mx:ViewStack id="myViewStack" selectedIndex="{modelLocator.workflowState}"> ... </mx:ViewStack> |
Exemplo 5: Associando o selectedIndex à variável workflowState
Definindo constantes para uma melhor codificação
É muito simples manipular a camada view usando este método, contudo, seria um código potencialmente confuso. Por exemplo, pense que você tem o seguinte:
- Um ViewStack com dois filhos: uma tela de Login e uma tela de Boas Vindas
- O selectedIndex do ViewStack está associado à variável workflowState
- Um botão de login que dispara a ação mostrada no Exemplo 4
Isso pode funcionar perfeitamente, mas não considera nenhuma modificação, Se outro filho for adicionado ao ViewStack, pode bagunçar a ordem. Necessitamos então uma maneira melhor de setar o selectedIndex. Para implementar, é necessário apenas definir constantes dentro do ModelLocator.
1 2 3 4 5 | //DEFINE YOUR VARIABLES HERE public var workflowState:uint = 0; // DEFINE VIEW CONSTANTS public static const LOGIN_SCREEN = 0; public static const WELCOME_SCREEN = 1; |
Exemplo 6 - Definindo constantes View no ModelLocator
Utilizando este método, você tem apenas que modificar o valor em um local se o número do filho ou a posição dos filhos forem modificadas no ViewStack. Agora, você pode associar ao botão de login a seguinte ação ao evento click:
1 | myViewStack.selectedIndex = ViewModelLocator.WELCOME_SCREEN; |
Exemplo 7: modificando a view com uma constante definida
Utilizando este método você não somente proteje sua aplicação contra futuras mudanças, como deixa seu código muito mais lógico e didático. Outro desenvolvedor poderá olhar o código e entender o processo.
Screencast deste tutorial em breve!



