2010-06-20 9 views
8

digamos que tengo un widget personalizado que tiene un ClickHandler. Aquí está el ejemplo:GWT agregando 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!"); 
} 

}

Cuando trato de añadir este widget de la siguiente manera:

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

todo está bien. Si hago clic en mi botón, obtengo el mensaje que espero. Sin embargo, si lo añado la siguiente manera:

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

mi evento de clic no está siendo despedido. Estoy luchando por entender por qué. Sería bueno si alguien pudiera explicarme esto o vincularme a un recurso donde pueda leer esto. Finalmente, me gustaría saber si es posible agregar el manejador de clics luego anexé el evento secundario y si se recomienda hacerlo. Gracias, avance por ayuda.

kuku

Respuesta

7

Cuando se llama a add(), Widget.onAttach() se llama en el widget que se agrega al panel. onAttach hace algún trabajo para registrar el widget para recibir eventos. appendChild() simplemente conecta un elemento DOM a otro y no hace nada más. Usted debe ser capaz de obtener los eventos que trabajan en el segundo caso, al hacer esto:

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

Sin embargo, no he probado esto y yo no recomendaría que lo utilice en una aplicación real. El uso de add() es definitivamente preferido, usar appendChild() de esta manera no tiene ventajas y puede conducir a un comportamiento inesperado.

Cuestiones relacionadas