2010-04-10 9 views
12

Quiero eliminar un controlador de eventos GWT la primera vez que recibo un evento. También quiero evitar contaminar mi clase con el seguimiento de objetos de registro que no son realmente necesarios. Actualmente lo tengo codificado como:GWT removeHandler en la notificación del primer evento

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 
    } 
});

pero el uso de registrationRef hace que el código sea menos legible. ¿Hay una mejor manera de hacerlo sin agregar variables a mi clase?

Respuesta

11

que acababa de hacer que el objeto HandlerRegistration un campo de la clase envolvente, de esa manera usted no será molestado por el compilador y es más "elegante" que barajar las matrices y otras cosas:

public class TestWidget extends Composite { 
    //... 

    HandlerRegistration handler; 

    public TestWidget() { 
     // ... 

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

} 
+0

Sí, Gracias. Supongo que este es el camino a seguir cuando solo tienes uno de estos oyentes en una clase (las cosas se vuelven más complicadas cuando tienes una cantidad arbitraria de widgets que estás tratando de esta manera). Esperaba que hubiera una forma de hacerlo sin agregar un nuevo campo. Oh, bueno ... – Keith

+0

Esto puede no ser tan sencillo como parece. Tengo un caso donde el controlador está configurado como nulo en el método onXXX(). ¿Por qué? Porque no hay nada que impida que GWT llame al controlador de inmediato. Por ejemplo, en el caso de IE en Image.onLoad(), si la imagen ya está cargada, puede llamar al controlador realmente durante la llamada addLoadHandler(). Encontré en ese caso que la única solución era envolver un cheque "si nulo", luego limpiarlo más tarde. – John

+2

Esto no funciona si el controlador se puede agregar varias veces. – ubiquitousthey

Cuestiones relacionadas