4

次のようなUIがあります。

    +--------+---------------+
    | model1 | model details |
    | model2 |     here,     |
    | model3 | loaded as the |
    |        | user selects  |
    |        | a model from  |
    |        |   the left.   |
    |        |               |
    +--------+---------------+

この UI を駆動するためにMVP パターンを使用しています。

ここではかなり単純化していますが、分割して征服するために、Presenter を 2 つに分割したいと思います。1 つは、左側のビューでユーザーのジェスチャーを処理します (ユーザーは、このビューでモデル リストを変更します。たとえば、並べ替え)。もう 1 つのプレゼンターは、右側のビューでユーザー ジェスチャを処理します (ユーザーは、このビューで個々のモデルを変更します)。

左側のプレゼンターはモデルのリスト全体とやり取りしますが、右側のプレゼンターは単一のモデルのみとやり取りします。つまり、ユーザーが左側のリストから選択したモデルです。IOW UI は左から右に駆動されます。

ユーザーが左側のモデルを選択 (つまり、クリック) すると、現在の実装は (大まかに) 次のようになります。

LeftPresenter.onModelClick = function(event) {
    var model = this.getModelFromEvent(event);
    this.view.setSelectedModel(model); // updates list widget on left
    RightPresenter.setSelectedModel(model); // notify the other Presenter
}

RightPresenter.setSelectedModel = function(model) {
    // lazy load the model from the db, and update the
    // view when the model fires the "loadComplete" event
    model.bind('loadComplete', this.view.setModel);
    model.lazyLoad();
}

これは、MVPパターン、またはその問題に関するMVC GUIパターンに関して、私が曖昧な部分です。

  1. このように、UI を複数のプレゼンターで操作できますか?
  2. 複数のプレゼンターを分離する必要がありますか、それともここに示すように互いに直接通信できますか?

だから私の質問は次のようになります:ユーザーがのビューでモデルを選択したことを示す最良の方法は何RightPresenterLeftPresenterですか?

4

1 に答える 1

1

1. UI は、このように複数のプレゼンターによって駆動できますか?

はい

2. 複数のプレゼンターを分離する必要がありますか、それともここに示すように相互に直接通信できますか?

私がこのようなフレームワークを持っていることを処理する方法

イベントが発生すると、UI_Object は Command オブジェクトを作成して起動するイベントを処理します。各 UI_Object は、UI_Views にあるビュー インターフェイスを実装し、それ自体を UI_View に登録します。コマンド オブジェクトは、インターフェイスを介して UI_View に登録された UI オブジェクトにアクセスできます。

たとえば、私の金属切断アプリケーションの 1 つには、切断用の金属シートに配置されていないすべての部品を含む HOLD と呼ばれる画面要素があります。部品はいくつかの方法でホールドに入ることができます。形状エディタで作成したパーツ ファイルからロードしたり、CAD 画面で作成したり、金属板からピックアップしたりします。

これらの各操作は、コマンド デザイン パターンを実装する個別の Command オブジェクトにカプセル化されます。コマンドオブジェクトが実行されると、それが呼び出されます。

CuttingScreen.Refresh
CADScreen.Refresh
ShapeEditor.Refresh

これらはそれぞれ、保留を更新するそれぞれの画面を更新します。

これで、アプリケーション インターフェイスにメソッドを追加できるようになりました。MyCuttingApplication.HoldRefresh は、3 つすべての更新を呼び出します。

ただし、重要な点は、ビューによって実装されたインターフェイスを使用して更新するコマンドをビューが呼び出すことです。ビュー オブジェクトが自身を下位層に登録すること。

于 2009-02-23T15:56:43.337 に答える