我使用GWT-Platform和GWT-Bootstrap框架构建了一个使用Google Web Toolkit的webapp。在我尝试实现弹出窗口之前,它几乎完美无瑕。这些框架的弹出窗口似乎完全不同。
当使用GWTP的com.google.gwt.user.client.ui.PopupPanel
或演示者的RevealRootPopupContentEvent.fire(source, content)
方法时,GWT-Platform希望弹出窗口小部件本身成为addToPopupSlot(child)
的实例。
GWT-Bootstrap的Modal与添加到底层面板的任何其他窗口小部件一样使用,但我的目标是拥有一个单独的演示者和视图,并可能使用AsyncProvider异步获取它。
我尝试将其设为PresenterWidget并使用addToSlot(slot, content)
来显示它,但它看起来不太正确。并非所有样式都以这种方式应用,并且关闭图标(×)不起作用。例如。
我认为我不是第一个尝试做类似事情的人,所以也许有人想出一个合适的方法让它发挥作用。
谢谢!
答案 0 :(得分:8)
您必须创建一个视图:
public class MyPopupView extends PopupViewImpl implements MyView {
protected Widget widget;
public interface MyPopupViewUiBinder extends
UiBinder<Widget, MyPopupView> {
}
@UiField(provided = true)
Modal dialogBox;
private MyPresenter presenter;
@Inject
public MyPopupView(final MyPopupViewUiBinder uiBinder,
final EventBus eventBus) {
super(eventBus);
setUpDialog(); // Provides UiField => Before initWidgets
initWidget(uiBinder.createAndBindUi(this));
}
// DialogBox must be overridden to let the presenter handle changes onUnload
private void setUpDialog() {
dialogBox = new Modal() {
@Override
protected void onUnload() {
MyPopupView.this.hide();
}
};
dialogBox.setTitle("Some title");
}
@Override
public void setPresenter(final MyPresenter presenter) {
this.presenter = presenter;
}
@Override
public final void hide() {
dialogBox.hide();
presenter.hide();
}
@Override
public void setAutoHideOnNavigationEventEnabled(final boolean autoHide) {
// TODO Auto-generated method stub
}
@Override
public void setCloseHandler(
final PopupViewCloseHandler popupViewCloseHandler) {
// TODO Auto-generated method stub
}
@Override
public void setPosition(final int left, final int top) {
// TODO Auto-generated method stub
}
@Override
public void show() {
dialogBox.show();
}
@Override
public void center() {
dialogBox.show();
}
@Override
public Widget asWidget() {
return widget;
}
protected final void initWidget(final Widget widget) {
this.widget = widget;
}
}
和UIBinder文件:
<!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:b='urn:import:com.github.gwtbootstrap.client.ui'>
<b:Modal title="Some Title" ui:field="dialogBox">
<!-- Your content -->
</b:Modal>
</ui:UiBinder>
答案 1 :(得分:3)
你的gwtp popup presenter有一个视图,它扩展了实现PopupView的PopUpViewImpl,并使用该接口的很多方法来显示弹出窗口(asPopupPanel(),show(),center()等)。
我刚刚开始了解gwt-bootstrap(看起来很棒+ caalos0),但似乎Modal没有实现PopupView,因此无法以gwtp自动显示的方式传递给addToPopupSlot
对于addToSlot()问题,您使用的是RootLayoutPanel还是RootPanel? 这可能是addToSlot无法正常工作的原因,因为gwt-bootstrap Modal小部件在初始化时附加到RootPanel,这可能会导致奇怪的布局行为以及使用RootLayoutPanel作为基础的应用程序。
我会尝试扩展Modal组件,让它实现PopUpView,将其添加为附加到弹出式演示器的PopUpViewImpl上的字段,并覆盖PopUpViewImpl asPopupPanel()函数以返回新的扩展模式。
答案 2 :(得分:3)
根据@dominik的回答,我做了一些改进,请参阅我的Gist。它包含一些可用于任何Modal / PopupView实现的抽象基类。它有点复杂但也更清晰,因为我们没有将整个Presenter
传递给View
。模式关闭时View
与Presenter
互动的界面为HasModalUnbind
。
您可以按如下方式使用这些类。示例演示者:
public class ErrorModalPresenter extends ModalPopupPresenter<ErrorModalPresenter.MyView> {
public interface MyView extends ModalPopupView {
DivElement getErrorMessage();
}
private final ErrorEvent error;
@Inject
public ErrorModalPresenter(final EventBus eventBus,
final MyView view,
@Assisted final ErrorEvent error) {
super(eventBus, view);
this.error = error;
}
@Override
public void unbindModal() {
ErrorDismissEvent.fire(this, this);
}
@Override
protected void onBind() {
super.onBind();
//noinspection ThrowableResultOfMethodCallIgnored
getView().getErrorMessage().setInnerText(error.getCause().getMessage());
}
}
示例视图:
public class ErrorModalView extends ModalPopupViewImpl implements ErrorModalPresenter.MyView {
@UiField(provided = true)
Modal errorModal;
@UiField
DivElement errorMessage;
interface Binder extends UiBinder<Widget, ErrorModalView> {}
@Inject
public ErrorModalView(final EventBus eventBus,
final Binder uiBinder) {
super(eventBus);
errorModal = initModal();
initWidget(uiBinder.createAndBindUi(this));
}
@Override
public DivElement getErrorMessage() {
return errorMessage;
}
}
UiBinder XML仅用于记录:
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
xmlns:g='urn:import:com.google.gwt.user.client.ui'
xmlns:b='urn:import:com.github.gwtbootstrap.client.ui'>
<b:Modal ui:field='errorModal' title='Error'>
<g:HTML>
<div ui:field='errorMessage'/>
</g:HTML>
<b:ModalFooter>
<b:Button text='Close' dismiss='MODAL'/>
</b:ModalFooter>
</b:Modal>
</ui:UiBinder>
在unbindModal()
的{{1}}中,我发起一个由ErrorModalPresenter
的父节目主持人捕获的事件。从容器中删除模态演示器,然后在演示者上调用ErrorModalPresenter
。当然,在unbind()
中可以使用任何其他解决方案。
基类假设模态是一次性模态,一旦被隐藏就会被删除。可以在unbindModal()
的{{3}}中更改此行为。
答案 3 :(得分:0)
我相信你必须制作一些胶水代码才能使它有效。
我从未使用GWT-Platform弹出窗口,所以我不确切知道如何,但我相信你必须创建一个新的类扩展PopupPresenter,并做出使其工作所需的东西。
此外,几天前我正在考虑GWT-Platform ......我很确定当GWT-Platform首次发布时,我将创建一个新项目来制作这些必要的胶水代码。
如果您需要任何帮助,请与我联系。
谢谢,抱歉gwt-platform支持不佳。