我正在尝试创建一个封装我的菜单栏的复合小部件。我希望它定义了单击处理程序,以便我可以简单地将它添加到我创建的任何.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?
我希望有人能够提供帮助。多年来一直困在这个问题上!
先谢谢你们!
答案 0 :(得分:1)
解决这个问题的两种方法:
复合材料:
public HasClickhandlers getAboutLink() {
return aboutLink
}
页:
menuBar.getAboutLink.addClickHandlers(new ClickEvent() {
});
menuBar.setPresenter(this);
)中设置复合材料中的演示者。然后,您可以通过演示者和Composite之间的接口合约处理点击。 第一种方法突破了MVP模式。第二种方法就是在这方面更像MVP。但是你必须考虑以下问题:
EventBus