2010-06-23 76 views
4

我正在使用的應用程序包含大量文本框的設置數據頁面;每個頁面都有一個保存按鈕。我已經將大多數頁面定義爲* .ui.xml文件,並使用了GWT 2.0 UI綁定。啓用和禁用GWT頁面上的保存按鈕

我想添加一個保存按鈕,該按鈕被禁用onload,並且只有在用戶將數據修改爲其中一個文本框後才能啓用。

我知道我可以註冊一個事件處理程序對頁面上的每個元素來啓用按鈕,但我想要一個更優雅的解決方案。理想情況下,我想定義一個「監聽」頁面上的事件並自行更改的按鈕。這是可能的GWT?

回答

4

你也可以改變事件添加到含有小部件你的整個使用addDomHandler

public class SetupDataPage extends Composite{ 

    // Binder stuff 

    // Button from the binder 
    @UiField Button saveBtn; 

    public SetupDataPage(){ 
     addDomHandler(new ChangeHandler() { 

      @Override 
      public void onChange(ChangeEvent event) { 
       saveBtn.setEnabled(true); 
      } 
     }, ChangeEvent.getType()); 
    } 
} 

謹防這將觸發對SetupDataPage所有文本框的事件。另一方面,它可能不適用於某些特定的小部件。我知道它的GWT的文本框,複選框,列表框...

+0

這對我們很有效。使用domHandler加載頁面時是否存在性能問題? – Tihom 2010-06-24 14:44:11

+0

@Tihom我們沒有注意到任何,但沒有先進的性能測試已經完成。 – Jla 2010-06-24 15:14:37

+0

這大部分工作。我們發現的例外是IE瀏覽器,如果頁面有一個列表框。在IE中更改列表框中的值不會觸發dom上的ChangeEvent。我不得不在列表框上添加一個顯式的更改處理程序來使其工作 – Tihom 2010-06-28 19:35:19

1

您可以制定出一個非常簡單的解決這個。

  1. 放在一個HTMLPanel所有的編輯控件(或任何其他面板,如果你願意的話)
  2. 擁有一個UI:在附帶的Java文件字段參考這個HTMLPanel。
  3. 在您的java類中調用initWidget後不久,遍歷HTMLPanel的所有子部件並在每個輸入部件上註冊一個ChangeHandler。

僞代碼:

for (int i = 0; i < hTMLPanel.getWidgetCount(); i++) 
    { 
     Widget widget = hTMLPanel.getWidget(i); 

     if (widget instanceof HasChangeHandlers) 
      ((HasChangeHandlers)widget).addChangeHandler(<Your Change Handler to enable save>); 
    } 

可以使這個遞歸的,如果你有嵌套小部件。

+3

我只想補充一點,你應該在進入循環之前定義'ChangeHandler',然後重用它 - 不需要創建/實例化它爲每個元素。 – 2010-06-23 17:16:13

+0

更改處理程序的問題在於它們在「焦點丟失」事件上執行。所以你需要在文本框中輸入一個值,然後使用TAB鍵或點擊某處,然後你的處理程序將被執行。此外,這個「價值變化」事件將阻止「鼠標點擊」。例如在文本字段中輸入一個值,然後點擊一些「更新」按鈕。你的「更改」處理程序將被執行,但你的鼠標點擊處理程序不會。 – Alex 2012-06-18 17:42:55

1

DOM處理程序是更好,會執行得更快..