0

最近、Flex でカスタム レポート UI のプロジェクトを完了しました。今、私は基本的に元の UI の「ライト」バージョンである新しいアプリケーションを作成する任務を負っています。元のアプリケーションにあるオプションの一部のみが含まれます。また、別のアプリケーションである必要があります。

コードを複製したくないので、多数のクラスを元のアプリケーションから、両方のアプリケーションで共有できる新しいライブラリに移動することを計画しています。ただし、MVC 環境でこれを機能させる方法を見つけようとしています。

たとえば、ユーザーが複数のアイテムをフィルター処理できるアコーディオン コンポーネントがあります。各 Accordion の子は、2 つのリストを持つカスタム コンポーネントのインスタンスです (1 つは選択可能なエンティティ用、もう 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 コンポーネントを作成するだけです。私はここでロッカーから完全に離れていますか、それとも何ですか?

4

1 に答える 1

2

これは Cairngorm の大きな欠点の 1 つです。ビューはモデルに関連付けられています。とはいえ、再利用したいコンポーネントをより汎用的にカプセル化することで、多くの苦痛を軽減できます。次に、それらを拡張してアプリの残りの部分に関連付けます。

したがって、最初のコンポーネントは次のようになります。

<?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>

それは理にかなっていますか?「ビュー」と「コンポーネント」の違いです。コンポーネントは再利用できますが、ビューは再利用できません。コンポーネントはカプセル化され、ビューはアプリケーション固有です。

于 2009-06-05T15:42:18.837 に答える