2010-06-20 8 views
8

lässt sagen, ich habe ein benutzerdefiniertes Widget, das einen ClickHandler hat. Hier ist das Beispiel:GWT Hinzufügen eines ClickHandler zu einem DOM-Element

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

}

Wenn ich versuche, dieses Widget wie folgt hinzuzufügen:

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

alles in Ordnung ist. Wenn ich auf meine Schaltfläche klicke, erhalte ich die Nachricht, die ich erwarte. Allerdings, wenn ich hinzufügen, es wie folgt aus:

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

meine Click-Ereignis nicht ausgelöst wird. Ich versuche zu verstehen, warum. Es wäre nett, wenn mir jemand das erklären könnte oder mich mit einer Ressource verlinkt, wo ich das nachlesen kann. Schließlich würde ich gerne wissen, ob es möglich ist, den Clickhandler nachträglich hinzuzufügen, ich habe das Kind-Event angehängt und wenn das so empfohlen wird. Danke, dass es um Hilfe geht.

kuku

Antwort

7

Wenn Sie add() aufrufen, wird Widget.onAttach() auf das Widget genannt, die an der Platte hinzugefügt wird. onAttach funktioniert, um das Widget für den Empfang von Ereignissen zu registrieren. appendChild() verbindet einfach ein DOM-Element mit einem anderen und macht nichts anderes. Sie sollen dies im zweiten Fall Ereignisse bekommen arbeiten können, indem Sie:

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

Aber ich habe nicht getestet, und ich würde nicht empfehlen, dass Sie es in einer realen Anwendung verwenden. Die Verwendung von add() ist definitiv bevorzugt, die Verwendung von appendChild() auf diese Weise hat keine Vorteile und kann zu unerwartetem Verhalten führen.

Verwandte Themen