web-dev-qa-db-ja.com

Vaadin 7:UIとナビゲーター+ビューの使用

Vaadin 7では、Webアプリケーションは複数のエントリポイントを持つことができます。 UI。各 [〜#〜] ui [〜#〜] は、 View sを含む単一の Navigator のみを持つことができます。

マルチレベルナビゲーションを必要とするアプリケーションに取り組んでおり、一部の画面では、ナビゲーターを備えた単一のUIを使用するか、共有メニューコンポーネントを備えた複数のUIを使用する必要があるかがわかりません。

UIとNavigatorの長所と短所は何ですか?この選択に関するガイドラインはありますか?

30
cporte

私の意見では、仕事をするのに十分なので、Navigatorで1つのUIを使用することをお勧めします。多くのUIの主な不都合は、UIを切り替える際の再読み込みです。また、希望する一貫性について覚えておく必要があります。各UIで同じヘッダーを持つようにします。そして、私の経験から、あなたは確かにより多くの問題に遭遇するでしょう;-)

きれいにするには、 MVPパターン を使用する必要があります。イベントを処理するために、com.google.common.eventbus.EventBusでこれに似たものを使用します。私は自分の意見にeventBusを追加し、そこにイベントを投稿して適切なプレゼンターで処理します。 MVPは既に「プレゼンター」と「ビュー」を予約しているため、Vaadinビューを「ページ」と呼びます。

ヘッダー、フッターのメインメニューを作成し、コンテンツコンテナ(レイアウトなど)を作成して、ナビゲータを次のように配線できます。

Navigator n = new Navigator(UI.getCurrent(), layout);

ナビゲーションを管理するためにPagesEnumを作成し、ビューを変更するときに、PageEnum.SOME_PAGEをパラメーターとして取得するChangePageEventをポストします。オプションで、表示するアイテムのIDもあります。だから、MainPresenterには次のものがあります。

@Subscribe
public void changePage(ChangePageEvent event) {
    String url = event.getPageName();
    if (event.hasId()) {
        url += "/" + event.getEntityId();
    }
    navigator.navigateTo(url);
}

次に、さまざまな可能性があります。

  • ページのEnterメソッド(Vaadinビュー)で、適切なサブメニューが表示されていることを確認します。

  • changePageEventにパラメーターとして追加し、changePageメソッドで処理します。

  • 新しいフィールドとしてPageEnumにハードコードします。 subMenuおよびサブメニューの他の列挙を作成し、changePageメソッドで処理します。

サブメニューは、おそらくNavigatorを配線するコンテナの外部にあるため、SubMenuPresenterとSubMenuViewを作成して、サブメニューの変更を処理できます。

15
dzezzz

あなたの質問の主題は、過去2013年に非常に汗をかきました。私はVaadin 7 UIとNavigatorのさまざまな側面を研究、分析、テストしました。

私はこのテーマに関する多くのフレームワーク、wiki、論文を見ました。 Vaadin 7に関連するものと関連しないもの。

少し前(2013年初頭)でしたが、私はこのテーマについて新鮮ではありません。とにかく、これらは私が復活させることができるリンクの一部です:

要件は、Vaadin MVP Liteのシナリオに多少似ていました。しかし、ビューの構成をさらに抽象化し、柔軟性を必要としていました。提供されたナビゲーターを一生懸命使用しようとしましたが、簡単にカスタマイズできませんでした。

Navigatorは具象クラスです。 UIに含めることができるナビゲータは1つだけです。 Navigatorコンストラクターには、次の行があります。

this.ui.setNavigator(this);

Navigatorは、単純なニーズを持つほとんどのアプリケーションで素晴らしい仕事をし、すぐに使える素晴らしい機能を提供しますが、実際には拡張やカスタマイズを目的とするものではありません。留意すべきもう1つの側面は、Navigatorでビューを変更するときに、画面上のすべてのコンポーネントを変更することです。小さなビットを変更することはできません。

その後、私は面白い道に私を置くこのガイドを見つけました:ユーザーインターフェイスの作成、第7章-MSDN Microsoft

この記事は本当にすてきで、魅力的です。 Delphiやその他のコンポーネントベースのフレームワークの動作と多くの共通点がありますが、「地域」の概念は本当に恵まれました。他の章も非常に興味深いものです(モジュラーアプリケーション開発、MVVP)。

最終的に、1つのUIのみで構成される地域の概念を採用しました。簡単に言うと、次のように機能します。

  • 他のコンポーネントをホストできるGUIコンポーネントがあります。他のコンポーネントをホストできる場所は「穴」のようなものです。各穴は登録されており、文字列名に結合されたリージョンです(単純なhasmap)
  • リージョン名を使用して、リージョンに別のVaadinコンポーネントを「配置」して、それを表示できます。

UIが初期化されると、1つのリージョン(UI全体)が「ルート」リージョンとして登録されます。次に、ログインフォームを表すコンポーネントが「ルート」リージョンでホストされます。ログインに成功すると、別のコンポーネントが「ルート」リージョンでホストされます(ログインコンポーネントを削除します)。このコンポーネントもホストです。「メイン」と呼ばれる別のリージョンを登録し、左側のナビゲーションメニューも備えています。これで、コンポーネント(たとえば、ウェルカムページ)を表示する場合は、「メイン」リージョンを取得して、表示するコンポーネントを配置できます。

Vaadin Navigatorは、ブックマークと戻るボタンのサポートを実装しています。開発しなかったので残念でしたが、アプリケーションの要件ではありませんでした。私見、Vaadinの連中は、Navigatorをシンプルに保つために難しいが良い決断をした。状態管理は簡単に実装できません。将来、ナビゲータがさらに拡張可能になるといいですね。とにかく、現在のナビゲーターはほとんどの平均的なニーズに対応していると思います。

私の答えは予想よりも長い。私の努力が役立つことを願っています。

14
Jako