2011-05-25 26 views
0

這需要一些解釋。GWT:如何防止處理程序接收事件,直到用戶在確認框中選擇一個選項?

在我們的項目中,我們有一個彈出窗口,其中有很多可以在其中編輯的字段以及底部的保存和取消按鈕。點擊保存顯然會保存您所做的任何更改,或者在沒有更改時關閉彈出窗口。如果沒有更改,取消也會關閉彈出窗口。如果您在有更改時取消,會彈出一個確認對話框,詢問您是否確定要放棄所做的更改。

想法是,如果您單擊否,確認對話框將關閉,但彈出窗口不會,因爲用戶已表示他們不想放棄這些更改。

現在的問題是,當您單擊「取消」按鈕時,即使發生了更改,彈出框也會立即關閉。確認對話框也會彈出,但彈出窗口已經不存在了,所以沒什麼用。

發生這種情況的原因是關閉彈出窗口並顯示確認對話框的處理程序都作爲單擊處理程序附加到「取消」按鈕。在GWT切換到處理程序之前,這用於工作,因爲我們將偵聽器列表作爲參數傳遞給顯示確認對話框的方法。如果用戶認爲可以放棄更改,我們只會觸發這些監聽器。由於事件模型更改後我無法控制處理程序(它們保存在GWT Widget代碼中),所以我不能再這樣做了。

解決這個問題的想法是簡單地將關閉彈出窗口的處理程序添加到只有在確認對話框中選擇正確選項時纔會觸發的不同事件。我問這個問題的唯一原因是看看是否有其他的方式來做到這一點,因爲這個彈出的關閉處理程序被添加的東西是在我們的xml佈局中處理的,並且它需要一些有趣的架構更改才能使其工作正常。

:BeforePopupClosedEvent被觸發,打開確認對話框。如果用戶指示不應丟棄更改,則會取消BeforePopupClosedEvent。不幸的是,代碼會在等待用戶響應時繼續執行,並且關閉彈出窗口的處理程序繼續執行,因爲用戶尚未選擇選項。

回答

0

這是我爲解決此問題而做的一個小部件的早期草稿。後來我做了一個更通用的包裝子類SimplePanel,它將包裝任何小部件的點擊處理程序。

當addClickHandler被調用時,它通過切換替代HandlerManager來工作,並且當確認對話框返回時僅沿着HandlerManager觸發事件。

public class ConfirmButton extends Button 
{ 
    private HandlerManager handlerManager = new HandlerManager(this); 
    private String message = "Do you really want to do this?"; 
    private ClickHandler myRealClickHandler = new ClickHandler() { 

     @Override 
     public void onClick(ClickEvent event) 
     { 
      if (Window.confirm(message)) handlerManager.fireEvent(event); 
     } 
    }; 

    public ConfirmButton() 
    { 
     super(); 
     addDomHandler(myRealClickHandler, ClickEvent.getType()); 
    } 

    public ConfirmButton(String text) 
    { 
     this(); 
     setText(text); 
    } 

    public void setConfirmationPrompt(String prompt) 
    { 
     message = prompt; 
    } 

    @Override 
    public HandlerRegistration addClickHandler(ClickHandler handler) 
    { 
     HandlerRegistration ret = handlerManager.addHandler(ClickEvent.getType(), handler); 
     return ret; 
    } 
} 
相關問題