MVP パターン:複数のプレゼンターを分離する必要がありますか、それとも直接通信できますか?

StackOverflow https://stackoverflow.com/questions/576529

  •  05-09-2019
  •  | 
  •  

質問

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

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

私が使っているのは、 MVP パターン この UI を操作するには。

ここではかなり単純化していますが、分割統治するために、プレゼンターを 2 つに分割したいと思います。1 つは左側のビューでユーザー ジェスチャを処理するもの (ユーザーはこのビューでモデル リストを変更 (ソートなど))、もう 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. 複数のプレゼンターを分離する必要がありますか、それともここに示すように相互に直接通信できますか?

したがって、私の質問は次のようになります。 に伝える最善の方法は何ですか RightPresenter ユーザーがモデルを選択したこと LeftPresenterさんの見解?

役に立ちましたか?

解決

1。 UIは複数で駆動することができます     このようなプレゼンター?

はい

2。複数のプレゼンターはする必要があります     デカップリングまたは彼らが通信することができます     直接相互に示すように     ここに?

私はそれを処理する方法は、私はこのようになりますフレームワークを持っていること。

イベントはUI_Objectは、Commandオブジェクトを作成し、発火イベントを処理が発生した場合。各UI_ObjectビューインタフェースがUI_Viewsで見つかったとUI_Viewに自身を登録実装しています。コマンドオブジェクトは、インタフェースを介してUI_Viewにおける登録UIオブジェクトにアクセスすることができます。

私の金属切削用途の一例の画面要素は、切断のための金属のシート上に配置されていないすべての部分が含まれているHOLDと呼ばれています。一部には、ホールド、いくつかの方法に入ることができます。形状エディタで作成された部品ファイルからロードされ、私たちのCAD画面で作成された、または金属のシートからピックアップます。

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

CuttingScreen.Refresh
CADScreen.Refresh
ShapeEditor.Refresh

これらのそれぞれは、ホールドを更新し、それぞれの画面を更新します。

今、私は自分のアプリケーション・インターフェースにメソッドを追加することができます。順番にすべての3つのリフレッシュを呼び出しますMyCuttingApplication.HoldRefresh。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top