0

Недавно я завершил проект для пользовательского пользовательского отчета в Flex. Теперь мне поручено создать новое приложение, которое по сути является «облегченной» версией исходного пользовательского интерфейса. Он будет включать только некоторые из параметров, которые находятся в исходном приложении. Кроме того, это должно быть отдельное приложение.Как структурировать несколько проектов Cairngorm MVC с несколькими компонентами?

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

Например, у меня есть компонент Accordion, который позволяет пользователям фильтровать несколько элементов. Каждый ребенок Аккордеона является экземпляром настраиваемого компонента с двумя списками (один для сущностей, доступных для выбора, другой для объектов, выбранных пользователем). Каждый дочерний компонент имеет свойства, связанные с моделью и функциями, которые вызывают события Cairngorm.

Вот упрощенный пример:

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 и LabelFilter.mxml в значительной степени тот же дизайн, как GenreFilter.mxml, но и использовать их конкретных событий.

Итак, как мне это сделать? Не имеет смысла перемещать мою модель в общую библиотеку. Я просто хочу просто создать компоненты View в библиотеке. Неужели я полностью покинул свой рокер здесь или что?

ответ

2

Это один из больших недостатков Cairngorm - ваши взгляды привязаны к вашей модели. Тем не менее, вы можете смягчить большую боль, заставив компоненты, которые вы хотите использовать повторно, более общие и инкапсулированные. Затем расширьте их, чтобы связать их с остальной частью приложения.

Итак, ваш первый компонент становится:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Accordion xmlns:mx="http://www.adobe.com/2006/mxml" 
    xmlns:local="*"> 
    <mx:Script> 
     <![CDATA[ 
      [Bindable] 
      public var availableGenres:ArrayCollection; 

      [Bindable] 
      public var availableArtists:ArrayCollection; 

      [Bindable] 
      public var availableLabels:ArrayCollection; 

      [Bindable] 
      public var selectedGenres:ArrayCollection; 

      [Bindable] 
      public var selectedArtists:ArrayCollection; 

      [Bindable] 
      public var selectedLabels:ArrayCollection; 
     ]]> 
    </mx:Script> 

    <local:GenreFilter availableGenres="{availableGenres}" 
     selectedGenres="{selectedGenres}" /> 

    <local:ArtistFilter availableArtists="{availableArtists}" 
     selectedArtists="{selectedArtists}" /> 

    <local:LabelFilter availableLabels="{availableLabels}" 
     selectedLabels="{selectedLabels}" /> 
</mx:Accordion> 

Затем вы делаете это в каждом приложении (но с различными моделями/событий).

<library:SpecialAccordion ... 
    availableGenres="{_model.availableGenres}" 
    availableArtists="{_model.availableArtists}" 
    ... etc ... 
    > 

    <mx:Script> 
     <![CDATA[ 
      import model.ModelLocator; 

      [Bindable] 
      private var __model:ModelLocator = ModelLocator.getInstance(); 
     ]]> 
    </mx:Script> 

</library:SpecialAccordion> 

Имеет ли это значение? Это разница между «представлением» и «компонентом». Компоненты могут быть повторно использованы, а представления не могут. Компоненты инкапсулированы, представления специфичны для приложений.

+0

Вы попали в гвоздь на голове: ModelLocator - это всего лишь глобальные переменные, которые скрыты. –