2

フラッシュ AS3 と puremvc を使用してアプリを作成していますが、ビュー メディエーターを正しく処理する方法がちょっとわかりません...

OK - 3 つまたは 4 つの異なるビューがあり、それぞれが独自のメディエーターによって管理されています。各ビューは単独でのみ表示されます。1つが表示されている/ステージ上にある場合-他のものは非表示/ステージから削除されています(単純化されていますが、一度に1つずつ表示される個別のページと考えることができ、ナビゲーションバーにより、ユーザーは好きなときにビューを変更できます)

最初に、私が作成してステージに追加した各ビューメディエーターは、独自のビューコンポーネントであるため、そのビューを表示または非表示にする「ターン」のときは、ビューコンポーネントの addChild と removeChild が簡単でした。

しかし、私は puremvc.org で、それは良い習慣ではないことを読みました。ステージを通過します(私の場合、これは各メディエーターのviewComponentでした-各ビューが追加された場所-たとえば、viewComponent.addChild(foo)b.独自のビューを作成します-これにより、最初にそれを追加および削除できました.

そこで、推奨される方法に変更しました。各メディエーターを作成するときに渡すのは、それが管理するビュー コンポーネントです (ステージ/メイン ドキュメント クラスではなく)。

例えば。

var view:MyView = new MyView();
facade.registerMediator( new MyViewMediator( view ) );
viewComponent.addChild(view);

そのため、必要に応じて各ビューを削除/追加する方法がわかりません。各メディエーター内から可視性を簡単に設定できましたが、それを避けたかったのです-リソース管理に使用されていないときは削除することを好みます...

誰もがこれについて私がどのように「意図されている」かの良いアイデアを手に入れました(たとえば、ステージでビューが不要になった場合は、一時的に削除し、後で必要になったときに追加しますか?)-または私はいくつかの点が欠けていて (かなりの可能性があります!)、これについて間違った方法で行っていますか? 私は puremvc に非常に慣れていないので、正しくアプローチしているとは確信していません。ポインタは大歓迎です!

4

3 に答える 3

1

私は PureMVC の専門家のふりをするつもりはありませんが、私が好きな方法は、サイトの主要な領域のメディエーターのみを作成することです。たとえば、HeaderMediator、FooterMediator、ViewMediator などです。次に、「onRegister」が前述の他のメディエーターを作成する ApplicationMediator があります。このように、個々のビューごとにメディエーターを作成するのではなく、「ViewMediator」がビュー間の切り替えを処理します。私の「onRegister」関数は次のようになります。

override public function onRegister():void {
    var viewContainer:Sprite = viewComponent.addChild(new Sprite()) as Sprite;
    facade.registerMediator(new ViewMediator(viewContainer));

    var headerContainer:Sprite = viewComponent.addChild(new Sprite()) as Sprite;
    facade.registerMediator(new HeaderMediator(headerContainer));

    var footerContainer:Sprite = viewComponent.addChild(new Sprite()) as Sprite;
    facade.registerMediator(new FooterMediator(footerContainer));
}

次に、(配列、辞書、またはベクトルで) 呼び出されるのを待っているビューのプールを持つ ViewProxy を作成します。ビューを変更または設定するときは、ViewProxy からビューを取得し、ビュー オブジェクトを本文として通知 (SET_VIEW など) を送信する ChangeViewCommand を使用します。

これで、ViewMediator が通知「SET_VIEW」を処理します。removeChild(oldView) や addChild(newView) のような単純なものであれば、Mediator 自体で処理します。移行が必要で、さらにコードが必要な場合は、コマンドを使用して移行を処理します。

それが理にかなっており、役立つことを願っています。もちろん、私は物事を変えたり、新しいことに挑戦したりするのが好きです。

于 2011-08-17T02:03:57.553 に答える
0

May I ask your motivation for using PureMVC ? I don't want to start a holy war here, but one of the reasons behind the creation of the second generation frameworks (Mate,Swiz,Robotlegs,Parsely) was because of the absurd amount of difficulty in getting started with RIA application architecture.

Don't feel bad though, the newer frameworks have documentation, so it is easy to understand and figure out the motivation for all of the components, paradigms and actors that come into play.

于 2011-08-16T21:02:39.460 に答える
0

FlexFiend が述べたように、この状況は第 2 世代のフレームワークで対処する方が簡単です (少なくとも Robotlegs ではそうです。他のフレームワークについては言えません)。これは、通常、Robotlegs でメディエーターを明示的に作成または破棄することは決してないためです。代わりに、メディエーターをビュー コンポーネントに関連付けると、Robotlegs はビュー コンポーネントが追加および削除されるステージを常に監視し、適切なメディエーターのインスタンスを作成および破棄します。

したがって、PureMVC でこの種のものを実装するための 1 つのアプローチは、ステージ自体をビュー コンポーネントとして持つ StageMediator を用意し、Event.ADDED_TO_STAGE および Event.REMOVED_FROM_STAGE イベントをリッスンすることです。最後に、ビュー コンポーネントをメディエーターに関連付けるシステムが必要になります。https://github.com/robotlegs/robotlegs-framework/blob/master/src/org/robotlegs/base/MediatorMap.asをチェックして、Robotlegs でどのように行われるかを確認してください。

私は PureMVC アプリケーションのスイートの一部であるプロジェクトに取り組んでいるので、実際にこのようなものを実装しようとしていますが、正直なところ、他に選択肢がない限り、Robotlegs を使用するのが最も簡単だと思います!

于 2011-08-30T10:45:59.097 に答える