最近、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.mxmlとLabelFilter.mxmlは、 GenreFilter.mxmlとほぼ同じ設計ですが、特定のイベントに使用されます。
では、これをどのように行うべきですか?モデルを共有ライブラリに移動しても意味がありません。基本的に、ライブラリに View コンポーネントを作成するだけです。私はここでロッカーから完全に離れていますか、それとも何ですか?