2010-06-20 5 views
8

disons que j'ai un widget personnalisé qui a un ClickHandler. Voici l'exemple:GWT ajoutant un ClickHandler à un élément 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!"); 
} 

}

Quand j'essaie d'ajouter ce widget comme ceci:

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

tout va bien. Si je clique sur mon bouton, je reçois le message que j'attends. Cependant, si je l'ajoute comme ceci:

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

mon événement click n'est pas Licenciement. Je me bats pour comprendre pourquoi. Ce serait bien si quelqu'un pouvait m'expliquer cela ou me lier à une ressource où je peux lire ceci. Enfin, je voudrais savoir s'il est possible d'ajouter le clickhandler après avoir ajouté l'événement enfant et si cela est recommandé. Merci d'avance pour de l'aide.

Kuku

Répondre

7

Lorsque vous appelez add(), Widget.onAttach() est appelé sur le widget qui est ajouté au panneau. OnAttach fonctionne pour enregistrer le widget pour recevoir des événements. appendChild() attache simplement un élément DOM à un autre et ne fait rien d'autre. Vous devriez être en mesure d'obtenir des événements qui travaillent dans le second cas, en faisant ceci:

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

Cependant, je n'ai pas testé et je ne recommande pas que vous l'utilisez dans une application réelle. En utilisant add() est certainement préférable, en utilisant appendChild() de cette manière n'a aucun avantage et peut conduire à un comportement inattendu.

Questions connexes