9

私は、GWT-PlatformおよびGWT-Bootstrapフレームワークを使用してGoogleWebToolkitでWebアプリを構築しています。ポップアップを実装しようとするまで、ほとんど完璧でした。これらのフレームワークのポップアップの理解はかなり異なっているようです。

GWT-Platformは、ポップアップウィジェット自体がcom.google.gwt.user.client.ui.PopupPanel、GWTPRevealRootPopupContentEvent.fire(source, content)またはプレゼンターのaddToPopupSlot(child)メソッドを使用する場合のインスタンスであると想定しています。

GWT-BootstrapのModalは、基になるパネルに追加される他のウィジェットと同じように使用されますが、私の目標は、別個のプレゼンターとビューを持ち、AsyncProviderと非同期にフェッチすることです。

私はそれをPresenterWidgetとして作成し、それを明らかにするために使用しようとしましaddToSlot(slot, content)たが、それは完全に正しく見えません。すべてのスタイルがこのように適用されるわけではなく、たとえば、閉じるアイコン(×)は機能しません。

私はそのようなことをしようとしている最初の人ではないと思うので、誰かがそれを機能させるための適切な方法を考え出したのかもしれません。

ありがとう!

4

4 に答える 4

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>
于 2012-05-23T16:34:34.100 に答える
3

gwtpポップアッププレゼンターには、PopupViewを実装するPopUpViewImplを拡張するビューがあり、ポップアップを表示するためにそのインターフェイスの多くのメソッド(asPopupPanel()、show()、center()など)を使用します。

gwt-bootstrap(見栄えが良い+ caalos0)を知り始めたばかりですが、ModalはPopupViewを実装していないようです。したがって、gwtpによって自動的に表示される方法でaddToPopupSlotに渡すことはできません。

addToSlot()の問題については、RootLayoutPanelまたはRootPanelを使用していますか?gwt-bootstrapモーダルウィジェットが初期化時にRootPanelにアタッチされているため、addToSlotが正しく機能しない理由である可能性があります。これにより、RootLayoutPanelをベースとして使用するアプリケーションとともに奇妙なレイアウト動作が発生する可能性があります。

Modalコンポーネントを拡張し、PopUpViewを実装し、ポップアッププレゼンターにアタッチされたPopUpViewImplのフィールドとして追加し、PopUpViewImpl asPopupPanel()関数をオーバーライドして新しい拡張Modalを返します。

于 2012-05-23T12:57:32.850 に答える
3

@dominikの回答に基づいて、いくつかの改善を行いました。Gistを参照してください。これには、Modal/PopupViewの実装に使用できるいくつかの抽象基本クラスが含まれています。Presenter全体をに渡さないため、少し複雑ですが、よりクリーンですView。モーダルが閉じているときにViewと対話するためのインターフェイスはです。PresenterHasModalUnbind

これらのクラスは次のように使用します。プレゼンターの例:

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()

基本クラスは、モーダルが非表示になると削除されるワンショットモーダルであると想定しています。この動作は、のinitModal()で変更できますModalPopupViewImpl

于 2013-07-05T06:46:33.373 に答える
0

それを機能させるには、グルーコードを作成する必要があると思います。

私はGWT-Platformポップアップを使用したことがないので、正確な方法はわかりませんが、PopupPresenterを拡張する新しいクラスを作成し、それを機能させるために必要なものを作成する必要があると思います。

また、私は数日前にGWT-Platformについて考えていました...そして、GWT-Platformの最初のリリースがリリースされたら、これらの必要なグルーコードを作成するための新しいプロジェクトを作成すると確信しています。

これについてサポートが必要な場合は、私に連絡してください。

ありがとう、貧弱なgwt-platformサポートについて申し訳ありません。

于 2012-05-23T03:03:48.337 に答える