2010-04-10 14 views
12

Desidero rimuovere un gestore di eventi GWT la prima volta che ricevo un evento. Voglio anche evitare di inquinare la mia classe con oggetti di registrazione di tracciamento che non sono realmente necessari. Al momento l'ho codificato come:GWT removeHandler sulla notifica del primo 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 
    } 
});

ma l'uso di registrationRef rende il codice meno leggibile. C'è un modo migliore per farlo senza aggiungere variabili alla mia classe?

risposta

11

avevo appena rendere l'oggetto HandlerRegistration un campo di classe contenitrice, in questo modo non sarete disturbati dal compilatore ed è più "elegante" di mischiare le matrici e roba:

public class TestWidget extends Composite { 
    //... 

    HandlerRegistration handler; 

    public TestWidget() { 
     // ... 

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

} 
+0

Sì, Grazie. Immagino che questa sia la strada da percorrere quando hai solo uno di questi ascoltatori in una classe (le cose si complicano quando hai un numero arbitrario di widget che stai trattando in questo modo). Speravo che ci fosse un modo per farlo senza aggiungere un nuovo campo. Oh bene ... – Keith

+0

Questo potrebbe non essere così semplice come sembra. Ho un caso in cui il gestore è impostato su null nel metodo onXXX(). Perché? Perché non c'è niente che impedisca a GWT di chiamare immediatamente il gestore. Ad esempio, nel caso IE in Image.onLoad(), se l'immagine è già caricata, può chiamare effettivamente il gestore durante la chiamata addLoadHandler(). Ho trovato in quel caso l'unica correzione era di avvolgere in un controllo "se nulla", quindi ripulire più tardi. – John

+2

Questo non funziona se il gestore può essere aggiunto più volte. – ubiquitousthey

Problemi correlati