GWT-不能使用复合控件

GWT-不能使用复合控件,gwt,widget,composite,uibinder,Gwt,Widget,Composite,Uibinder,我正在尝试创建一个封装菜单栏的复合小部件。我希望它定义了点击处理程序,这样我就可以简单地将它添加到我创建的任何.ui.xml中 这是我的菜单栏ui.xml 关于 | 接触 | 登录 这是关联的视图: 公共类GeneralMenuBarImpl扩展复合实现GeneralMenuBar{ @UiTemplate(“GeneralMenuBar.ui.xml”) 接口GeneralMenuBarImplUiBinder扩展了UiBinder{} 专用静态GeneralMenuBarImplUi

我正在尝试创建一个封装菜单栏的复合小部件。我希望它定义了点击处理程序,这样我就可以简单地将它添加到我创建的任何.ui.xml中

这是我的菜单栏ui.xml


  • 关于
  • |
  • 接触
  • |
  • 登录
这是关联的视图:

公共类GeneralMenuBarImpl扩展复合实现GeneralMenuBar{
@UiTemplate(“GeneralMenuBar.ui.xml”)
接口GeneralMenuBarImplUiBinder扩展了UiBinder{}
专用静态GeneralMenuBarImplUiBinder uiBinder=
create(GeneralMenuBarImplUiBinder.class);
私人演讲者;
@UiField HTML登录链接;
@UiField-HTML-contactLink;
@UiField-HTML-aboutLink;
公共GeneralMenuBarImpl(){
initWidget(uiBinder.createAndBindUi(this));
}
公共void setPresenter(Presenter-Presenter){
this.presenter=演示者;
}
@UiHandler(“登录链接”)
仅作废登录链接已单击(单击事件){
presenter.onLoginLinkClicked();
}
@UiHandler(“contactLink”)
作废onContactLinkClicked(ClickEvent事件){
presenter.onContactLinkClicked();
}
@UiHandler(“关于链接”)
已单击Boutlink时无效(单击事件){
onAboutLinkClicked();
}
公共小部件asWidget(){
归还这个;
}
}

然后,通过向ui.xml文件添加正确的名称空间,将其包含在主页上,然后添加以下行

<widget:GeneralMenuBarImpl></widget:GeneralMenuBarImpl>

这可以显示菜单栏,但我的单击处理程序不起作用。我怀疑这是因为菜单栏没有接收到演示者来告知事件发生

所以我的问题是:如何将演示者传递给包含的小部件,或者如何从包含它的页面访问小部件的uiFields

我希望有人能帮忙。这个问题已经困扰了很久了


提前谢谢各位

解决此问题的两种方法:

  • 您可以在合成中公开链接,以便从包含页面访问它。包含页面可以将EventHandler附加到您的链接并在那里处理事件
复合材料:

public HasClickhandlers getAboutLink() {
    return aboutLink
}
第页:

  • 您必须从父页面/Presenter(
    menuBar.setPresenter(this);
    )中设置组合中的Presenter,其中包括组合。然后,您可以通过presenter和Composite之间的接口契约来处理单击
第一种方法稍微打破了MVP模式。第二种方法在这方面更像MVP。但是,您必须考虑以下问题:

  • 您的组合只是一个小部件,还是有足够的业务逻辑使PresenterWidget脱离它(定义Presenter/视图对)
  • 如果这个小部件只是一个简单的小部件,那么定义一个演示者可能是一种过分的做法(使用方法1)
  • 如果您想在应用程序范围内处理点击,还可以在应用程序范围的
    EventBus

解决此问题的两种方法:

  • 您可以在合成中公开链接,以便从包含页面访问它。包含页面可以将EventHandler附加到您的链接并在那里处理事件
复合材料:

public HasClickhandlers getAboutLink() {
    return aboutLink
}
第页:

  • 您必须从父页面/Presenter(
    menuBar.setPresenter(this);
    )中设置组合中的Presenter,其中包括组合。然后,您可以通过presenter和Composite之间的接口契约来处理单击
第一种方法稍微打破了MVP模式。第二种方法在这方面更像MVP。但是,您必须考虑以下问题:

  • 您的组合只是一个小部件,还是有足够的业务逻辑使PresenterWidget脱离它(定义Presenter/视图对)
  • 如果这个小部件只是一个简单的小部件,那么定义一个演示者可能是一种过分的做法(使用方法1)
  • 如果您想在应用程序范围内处理点击,还可以在应用程序范围的
    EventBus

谢谢您的回复!我使用了一个解决方案解决了这个问题,就像你在第2点中建议的那样。你的第一个想法是我还没有考虑过的。但如果需要在一个更简单的小部件中处理事件,我会记住这一点!再次感谢!谢谢你的回复!我使用了一个解决方案解决了这个问题,就像你在第2点中建议的那样。你的第一个想法是我还没有考虑过的。但如果需要在一个更简单的小部件中处理事件,我会记住这一点!再次感谢!