2010-04-10 16 views
12

我想刪除一個GWT事件處理程序,我第一次收到的事件。我也想避免用跟蹤沒有必要的註冊對象來污染我的課程。我目前編碼爲:GWT removeHandler在第一事件通知

final HandlerRegistration[] registrationRef = new HandlerRegistration[1]; 
registrationRef[0] = dialog.addFooHandler(new FooHandler() 
{ 
    public void onFoo(FooEvent event) 
    { 
     HandlerRegistration removeMe = registrationRef[0]; 
     if(removeMe != null) 
     { 
      removeMe.removeHandler(); 
     } 

     // do stuff here 
    } 
});

但是使用registrationRef會使代碼的可讀性降低。有沒有更好的方式來做到這一點,而不需要向我的班級添加變量?

回答

11

我只是做HandlerRegistration對象封裝類的領域,這樣你就不會被編譯器和煩惱它更「優雅」比洗牌陣列和東西:

public class TestWidget extends Composite { 
    //... 

    HandlerRegistration handler; 

    public TestWidget() { 
     // ... 

     handler = button.addClickHandler(new ClickHandler() { 
      @Override 
      public void onClick(ClickEvent event) { 
       // ... 
       handler.removeHandler();     
      } 
     }); 
    } 

} 
+0

是,謝謝。我想這是當你在一個類中只有一個這樣的監聽器的時候(當你擁有任意數量的小部件時,事情會變得更加混亂)。我希望有一種方法可以在不添加新字段的情況下執行此操作。哦... – Keith 2010-04-11 15:20:36

+0

這可能不是直線前進,因爲它似乎。我具有其中處理程序設置爲空值在onXXX()方法的情況。爲什麼?因爲沒有什麼可以阻止GWT立即調用處理程序。例如,在IE情況Image.onLoad(),如果圖像已加載它實際上可以在addLoadHandler()呼叫期間調用的處理程序。我在這種情況下,唯一的解決方法是在「如果空」檢查清理後包裝,然後找到。 – John 2011-06-30 14:48:46

+2

這不工作,如果處理程序可以添加多次。 – ubiquitousthey 2012-04-17 21:41:54