【问题标题】:GWT - Cant use a composite widgets clickhandlersGWT - 不能使用复合小部件 clickhandlers
【发布时间】:2012-05-10 13:58:57
【问题描述】:

我正在尝试创建一个复合小部件来封装我的菜单栏。我希望它定义了点击处理程序,以便我可以简单地将它添加到我创建的任何 .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?

我希望有人能够提供帮助。被这个问题困扰很久了!

提前谢谢各位!

【问题讨论】:

    标签: gwt widget composite uibinder


    【解决方案1】:

    解决这个问题的两种方法:

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

    复合:

    public HasClickhandlers getAboutLink() {
        return aboutLink
    }
    

    页面:

    menuBar.getAboutLink.addClickHandlers(new ClickEvent() {
    });
    
    • 您必须从包含您的合成的父页面/演示者 (menuBar.setPresenter(this);) 中设置合成中的演示者。然后你可以通过presenter和Composite之间的接口契约来处理点击。

    第一种方法与 MVP 模式略有不同。第二种方法在这方面更像是 MVP。但是,您必须考虑以下问题:

    • 您的组合只是一个小部件,还是它有足够的业务逻辑来制作一个 PresenterWidget(定义 Presenter/View 对)。
    • 如果小部件只是一个简单的小部件,那么定义演示者可能是一种矫枉过正(采用方法 1)。
    • 如果您想在应用程序范围内处理点击,您还可以在应用程序范围内触发事件EventBus

    【讨论】:

    • 感谢您的回复!我使用与您在第 2 点中建议的解决方案非常相似的解决方案解决了这个问题。您的第一个想法是我尚未考虑的。但如果需要在更简单的小部件中处理事件,我会记住这一点!再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2012-03-15
    • 2011-09-10
    相关资源
    最近更新 更多