0

私は最近、カスタムレポートFlexでUIのためのプロジェクトを完了しました。今、元のUIの本質的に「軽い」バージョンである新しいアプリケーションを作成する作業があります。元のアプリケーションに含まれるいくつかのオプションだけが含まれます。また、別のアプリケーションである必要があります。いくつかのコンポーネントを共有する複数のCairngorm MVCプロジェクトをどのように構築すればよいですか?

私は私のコードを複製したくないので、私は両方のアプリケーションで共有できる新しいライブラリに、元のアプリケーションからのクラスの束を移動することを計画しています。しかし、私はMVC環境でこの作業を行う方法を理解しようとしています。例えば

、私は、ユーザーが複数の項目をフィルタリングすることができますAccordionコンポーネントを持っています。各アコーディオンの子は、2つのリストを持つカスタムコンポーネントのインスタンスです(選択できるエンティティ用、ユーザーが選択したエンティティ用の1つ)。各子コンポーネントには、モデルにバインドされたプロパティと、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.mxmlLabelFilter.mxmlかなりのGenreFilter.mxmlと同じデザインですが、その特定のイベントに使用します。

だから私はこれをどのようにしたらよいでしょうか?私のモデルを共有ライブラリに移動するのは意味がありません。基本的には、ライブラリにViewコンポーネントを作成するだけです。私はここで私のロッカーを完全にオフにしていますか?あなたの意見はあなたのモデルに結び付けられている - ケアンゴームの大きな欠陥の一つだ

答えて

2

。つまり、再利用したいコンポーネントをより包括的にカプセル化することで、多くの苦痛を緩和することができます。その後、それらを拡張してアプリケーションの残りの部分に関連付けます。

だから、あなたの最初のコンポーネントは次のようになります。

その後
<?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は変装だけでグローバル変数です。 –

関連する問題