J'ai récemment terminé un projet d'interface utilisateur de rapport personnalisé dans Flex. Maintenant, j'ai été chargé de créer une nouvelle application qui est essentiellement une version «allégée» de l'interface utilisateur originale. Il inclura seulement quelques-unes des options qui sont dans l'application originale. En outre, il doit être une application distincte. Je ne veux pas dupliquer mon code, j'ai donc l'intention de déplacer un tas de classes de l'application originale à une nouvelle bibliothèque qui peut être partagée par les deux applications. Cependant, j'essaie de comprendre comment faire fonctionner cela dans mon environnement MVC. Par exemple, j'ai un composant Accordion qui permet aux utilisateurs de filtrer plusieurs éléments. Chaque enfant accordéon est une instance d'un composant personnalisé avec deux listes (une pour les entités disponibles pour la sélection, l'autre pour les entités sélectionnées par l'utilisateur). Chaque composant enfant a des propriétés liées au modèle et des fonctions qui appellent des événements Cairngorm.Comment structurer plusieurs projets Cairngorm MVC partageant plusieurs composants?
Voici un exemple simplifié:
FiltersAccordion.mxml:
<?xml version="1.0" encoding="utf-8"?>
<mx:Accordion xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:local="*">
<mx:Script>
<![CDATA[
import model.ModelLocator;
[Bindable]
private var __model:ModelLocator = ModelLocator.getInstance();
]]>
</mx:Script>
<local:GenreFilter availableGenres="{__model.availableGenres}"
selectedGenres="{__model.selectedGenres}" />
<local:ArtistFilter availableArtists="{__model.availableArtists}"
selectedArtists="{__model.selectedArtists}" />
<local:LabelFilter availableLabels="{__model.availableLabels}"
selectedLabels="{__model.selectedLabels}" />
</mx:Accordion>
GenreFilter.mxml:
<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import control.events.AddGenresEvent;
import control.events.RemoveGenresEvent;
import model.ModelLocator;
[Bindable]
private var __model:ModelLocator = ModelLocator.getInstance();
[Bindable]
public var availableGenres:ArrayCollection;
[Bindable]
public var selectedGenres:ArrayCollection;
private function addGenresButton_clickHandler():void
{
var event:AddGenresEvent = new AddGenresEvent();
event.availableGenres = availableGenres;
event.selectedGenres = selectedGenres;
event.itemsToAdd = availableGenresList.selectedItems;
event.dispatch();
}
protected function removeGenresButton_clickHandler():void
{
var event:RemoveGenresEvent = new RemoveGenresEvent();
event.availableGenres = availableGenres;
event.selectedGenres = selectedGenres;
event.itemsToRemove = selectedGenresList.selectedItems;
event.dispatch();
}
]]>
</mx:Script>
<mx:List id="availableGenresList" dataProvider="{availableGenres}" />
<mx:VBox>
<mx:Button id="addButton" icon="{rightArrowIcon}" width="22"
height="22" click="addGenresButton_clickHandler();" />
<mx:Button id="removeButton" icon="{leftArrowIcon}" width="22"
height="22" click="removeGenresButton_clickHandler();" />
</mx:VBox>
<mx:List id="selectedGenresList" dataProvider="{selectedGenres}"
width="100%" height="100%" allowMultipleSelection="true" />
</mx:HBox>
ArtistFilter.mxml et LabelFilter.mxml sont à peu près le même design que GenreFilter.mxml, mais utiliser à leurs événements spécifiques.
Alors, comment dois-je faire cela? Cela n'a aucun sens de déplacer mon Modèle dans la bibliothèque partagée. Je veux simplement créer simplement des composants View dans la bibliothèque. Suis-je totalement hors de mon rocker ici, ou quoi?
Vous frappez le clou sur la tête: ModelLocator est juste des variables globales déguisées. –