1

メニュー バーをカプセル化する複合ウィジェットを作成しようとしています。クリック ハンドラーを定義して、作成した .ui.xml に簡単に追加できるようにします。

これは私のメニューバーの ui.xml です

<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder 
  xmlns:ui="urn:ui:com.google.gwt.uibinder"
  xmlns:g="urn:import:com.google.gwt.user.client.ui"
  xmlns:v="urn:import:com.epiuse.cloud.portal.ui.client.view"
  xmlns:widget="urn:import:com....client.widgets">


<g:AbsolutePanel styleName="navBar">
    <g:HTMLPanel>
    <ul>
        <li><g:HTML ui:field="aboutLink"><a>About</a></g:HTML></li>
        <li>|</li>
        <li><g:HTML ui:field="contactLink"><a>Contact</a></g:HTML></li>
        <li>|</li>
        <li><g:HTML ui:field="loginLink"><a>Login</a></g:HTML></li>
    </ul>
    </g:HTMLPanel>
</g:AbsolutePanel>  
</ui:UiBinder> 

これは関連するビューです:

public class GeneralMenuBarImpl  extends Composite implements GeneralMenuBar {

@UiTemplate("GeneralMenuBar.ui.xml")
interface GeneralMenuBarImplUiBinder extends UiBinder<Widget, GeneralMenuBarImpl> {}
private static GeneralMenuBarImplUiBinder uiBinder =
       GWT.create(GeneralMenuBarImplUiBinder.class);

 private Presenter presenter;

 @UiField HTML loginLink;
 @UiField HTML contactLink;
 @UiField HTML aboutLink;


 public GeneralMenuBarImpl(){

     initWidget(uiBinder.createAndBindUi(this));

 }

public void setPresenter(Presenter presenter){
     this.presenter = presenter;
}



 @UiHandler("loginLink")
void onLoginLinkClicked(ClickEvent event) {
    presenter.onLoginLinkClicked();
}
@UiHandler("contactLink")
void onContactLinkClicked(ClickEvent event) {
    presenter.onContactLinkClicked();
}
@UiHandler("aboutLink")
void onAboutLinkClicked(ClickEvent event) {
    presenter.onAboutLinkClicked();
}

public Widget asWidget(){
     return this;
 }

}

次に、正しい名前空間を ui.xml ファイルに追加してホームページに含め、次の行を追加します。

<widget:GeneralMenuBarImpl></widget:GeneralMenuBarImpl>

これはメニュー バーを表示するために機能しますが、クリック ハンドラーが機能しません。メニューバーが、イベントが発生したことを伝えるプレゼンターを受け取っていないためだと思います。

私の質問は次のとおりです。含まれているウィジェットにプレゼンターを渡すか、ウィジェットを含めているページからウィジェットの uiFields にアクセスするにはどうすればよいですか?

誰かが助けてくれることを願っています。何年もの間、この問題に悩まされてきました!

よろしくお願いします!

4

1 に答える 1

1

これを解決するには、次の 2 つの方法があります。

  • コンポジットでリンクを公開して、含まれているページからアクセスできるようにすることができます。含まれているページは、リンクに EventHandler を添付して、そこでイベントを処理できます。

複合:

public HasClickhandlers getAboutLink() {
    return aboutLink
}

ページ:

menuBar.getAboutLink.addClickHandlers(new ClickEvent() {
});
  • コンポジットを含める親ページ/プレゼンター ( menuBar.setPresenter(this);) からコンポジットにプレゼンターを設定する必要があります。次に、プレゼンターとコンポジットの間のインターフェイス コントラクトによってクリックを処理できます。

最初のアプローチは、MVP パターンで少し壊れています。2 番目のアプローチは、この点で MVP に似ています。ただし、次の質問について考える必要があります。

  • コンポジットは単なるウィジェットですか、それともそれから PresenterWidget を作成するのに十分なビジネス ロジックがありますか (Presenter/View ペアを定義します)。
  • ウィジェットが単純なウィジェットにすぎない場合、プレゼンターを定義するのはやり過ぎかもしれません (アプローチ 1 を使用してください)。
  • アプリケーション全体でクリックを処理したい場合は、アプリケーション全体でイベントを発生させることもできますEventBus
于 2012-05-11T08:13:46.407 に答える