2010-06-20 11 views
8

diciamo che ho un widget personalizzato che ha un ClickHandler. Ecco l'esempio:GWT aggiungendo un ClickHandler a un elemento DOM

public class TestWidget extends Composite { 

private static TestWidgetUiBinder uiBinder = GWT 
     .create(TestWidgetUiBinder.class); 

interface TestWidgetUiBinder extends UiBinder<Widget, TestWidget> { 
} 

@UiField 
Button button; 

public TestWidget(String firstName) { 
    initWidget(uiBinder.createAndBindUi(this)); 
    button.setText(firstName); 
} 

@UiHandler("button") 
void onClick(ClickEvent e) { 
    Window.alert("Hello!"); 
} 

}

Quando provo ad aggiungere questo Widget come questo:

TestWidget testWidget = new TestWidget("myTestWidget"); 
    RootPanel.get().add(testWidget); 

tutto va bene. Se clicco sul mio pulsante ottengo il messaggio che mi aspetto. Tuttavia, se aggiungo in questo modo:

TestWidget testWidget = new TestWidget("myTestWidget"); 
    RootPanel.getBodyElement().appendChild(testWidget.getElement()); 

mio evento click non è essere licenziato. Sto lottando per capire perché. Sarebbe bello se qualcuno potesse spiegarmi questo o collegarmi ad una risorsa in cui posso leggere questo. Infine mi piacerebbe sapere se è possibile aggiungere il clickhandler in seguito ho aggiunto l'evento figlio e se è consigliabile. Grazie per l'aiuto in anticipo.

Kuku

risposta

7

Quando si chiama add(), Widget.onAttach() è chiamato sul widget che viene aggiunto al pannello. onAttach fa del lavoro per registrare il widget per ricevere eventi. appendChild() semplicemente collega un elemento DOM a un altro e non fa nient'altro. Si dovrebbe essere in grado di ottenere gli eventi di lavoro, nel secondo caso in questo modo:

Element element = testWidget.getElement(); 
RootPanel.getBodyElement().appendChild(element); 
DOM.sinkEvents(element, 
    Event.getTypeInt(ClickEvent.getType().getName()) 
    | DOM.getEventsSunk(element); 

Tuttavia, non ho ancora testato questo e non mi consiglia di utilizzare in un'applicazione reale. L'utilizzo di add() è decisamente preferibile, l'utilizzo di appendChild() in questo modo non presenta vantaggi e può portare a comportamenti imprevisti.

Problemi correlati