在 gwt-platform 中使用 gwt-bootstrap 模式的正确方法是什么?



我正在使用GWT-Platform和GWT-Bootstrap框架构建一个带有Google Web Toolkit的Web应用程序。大多数情况下,在我尝试实现弹出窗口之前,它几乎完美无缺。这些框架对弹出窗口的不认可似乎完全不同。

GWT-Platform期望弹出小部件本身是使用GWTP的RevealRootPopupContentEvent.fire(source, content)或演示者的addToPopupSlot(child)方法时com.google.gwt.user.client.ui.PopupPanel的实例。

GWT-Bootstrap的模态与添加到底层面板的任何其他小部件一样使用,但我的目标是拥有一个单独的演示者和视图,并可能与AsyncProvider异步获取它。

我试图将其制作为PresenterWidget并使用addToSlot(slot, content)来显示它,但它看起来不太正确。并非所有样式都以这种方式应用,例如,关闭图标 (×( 不起作用。

我想我不是第一个尝试做这样的事情的人,所以也许有人已经找到了一种适当的方法来让它工作。

谢谢!

您必须创建一个视图:

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>

你的 gwtp popup presenter 有一个扩展 PopUpViewImpl 的视图,它实现了 PopupView,并使用该接口的许多方法来显示弹出窗口(asPopupPanel((、show((、center(( 等(。

我刚刚开始了解 gwt-bootstrap(看起来很棒 +caalos0(,但似乎 Modal 没有实现 PopupView,因此无法以 gwtp 自动显示的方式传递给 addToPopupSlot。

至于addToSlot((问题,您使用的是RootLayoutPanel还是RootPanel?这可能是addToSlot无法正常工作的原因,因为gwt-bootstrap Modal widget在初始化时附加到RootPanel,这可能会导致奇怪的布局行为以及使用RootLayoutPanel作为基础的应用程序。

我会尝试扩展模态组件,让它实现 PopUpView,将其添加为附加到弹出演示器的 PopUpViewImpl 上的字段,并覆盖 PopUpViewImpl asPopupPanel(( 函数以返回新的扩展模态。

根据我做了一些改进@dominik的回答,请参阅我的要点。它包含一些抽象基类,可用于任何Modal/PopupView实现。它有点复杂,但也更干净,因为我们不会将整个Presenter传递给View。当模态关闭时,ViewPresenter交互的接口是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() ErrorModalPresenter我触发了一个事件,该事件被ErrorModalPresenter的父演示者捕获。在那里,模式演示器从容器中删除,然后在演示器上调用unbind()。当然,任何其他解决方案都可以在unbindModal().

基类假定模态是一次性模态,一旦隐藏就会被删除。这种行为可以在 ModalPopupViewImpl 的 initModal(( 中更改。

我相信

你必须制作一些胶水代码才能让它工作。

我从未使用过GWT平台弹出窗口,所以我不知道具体如何,但我相信你必须创建一个扩展PopupPresenter的新类,并制作使其工作所需的内容。

另外,几天前我在想GWT平台...而且我很确定,当GWT平台的第一个版本发布时,我将创建一个新项目来制作这些必要的胶水代码。

如果您需要任何帮助,请与我联系。

谢谢,很抱歉 gwt 平台支持不佳。

相关内容

  • 没有找到相关文章

最新更新