2012-05-21 38 views
9

我正在使用GWT-PlatformGWT-Bootstrap框架構建一個帶有Google Web Toolkit的web應用程序。大多數情況下,直到我嘗試實現彈出窗口時,它幾乎是完美的。這些框架中的未知彈出窗口似乎是完全不同的。使用gwt-bootstrap模塊和gwt-platform的正確方法是什麼?

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

GWT-Bootstrap的Modal與其他任何被添加到底層面板的小部件一樣使用,但我的目標是擁有一個單獨的主持人和視圖,並可能通過AsyncProvider異步獲取它。

我試圖使它成爲PresenterWidget並使用addToSlot(slot, content)來揭示它,但它看起來不太正確。並非所有樣式都以此方式應用,並且關閉圖標(×)不起作用。

我想我不是第一個試圖做這樣的事情,所以也許有人已經找到了一個正確的方法來使它工作。

謝謝!

+1

開發商通常都相當響應它們的論壇問的問題:https://groups.google.com/forum/#!forum/gwt-bootstrap –

回答

8

你必須創建一個視圖:通過@dominik

<!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> 
+0

你能描述一下'presenter.hide()'方法嗎?它似乎不是一個普通的主持人方法。 – Raidok

+1

在我的情況下,它執行'placeManager.revealRelativePlace(-1);'。如果您不使用彈出式演示文稿的相對位置,則可能不需要它。 – Dominik

+0

cool @dominik!謝謝:) – caarlos0

0

我相信你將不得不做一些膠水代碼,使其工作。

我從來沒有使用GWT平臺彈出窗口,所以我不知道如何,但我相信你將不得不做一個新的類擴展PopupPresenter,並做了什麼需要使它的工作。

此外,我在前幾天想到GWT-Platform ......我非常確定,當第一版GWT-Platform發佈時,我將創建一個新項目來製作這些必要的膠水代碼。

如果您需要任何幫助,請與我聯繫。

非常感謝,對可憐的gwt平臺支持抱歉。

3

您的gwtp彈出式演示文稿有一個視圖,它擴展了實現PopupView的PopUpViewImpl,並使用該界面的很多方法來顯示彈出窗口(asPopupPanel(),show(),center()等)。

我剛剛開始瞭解gwt-bootstrap(看起來不錯+ caalos0),但似乎Modal沒有實現PopupView,因此無法以自動顯示的方式傳遞給addToPopupSlot gwtp。

至於addToSlot()問題,你使用的是RootLayoutPanel還是RootPanel? 這可能是addToSlot無法正常工作的原因,因爲gwt-bootstrap Modal小部件在初始化時會附加到RootPanel上,這可能會導致奇怪的佈局行爲以及使用RootLayoutPanel作爲基礎的應用程序。

我會嘗試擴展Modal組件,讓它實現PopUpView,將它添加爲連接到彈出式演示文稿的PopUpViewImpl上的字段,並重寫PopUpViewImpl asPopupPanel()函數以返回新的擴展Modal。

+0

是的,這是它。謝謝。 – caarlos0

3

基於答案我做了一些改進,看到我Gist

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的文件。它包含一些可用於任何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> 

ErrorModalPresenterunbindModal()我火它是由父抓住一個事件主持人ErrorModalPresenter。在那裏,模態演示者從容器中移除,然後在演示者上調用unbind()。當然,在unbindModal()中可能有其他解決方案。

基類假定模態是一次性模態,一旦它們被隱藏,它們將被移除。此行爲可在ModalPopupViewImplinitModal()中更改。

相關問題