假设我有一个具有ClickHandler的自定义小部件.这是一个例子:
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!");
}
Run Code Online (Sandbox Code Playgroud)
}
当我尝试添加这个Widget时:
TestWidget testWidget = new TestWidget("myTestWidget");
RootPanel.get().add(testWidget);
Run Code Online (Sandbox Code Playgroud)
一切都好.如果我点击我的按钮,我会得到我期望的消息.但是如果我像这样添加它:
TestWidget testWidget = new TestWidget("myTestWidget");
RootPanel.getBodyElement().appendChild(testWidget.getElement());
Run Code Online (Sandbox Code Playgroud)
我的点击事件没有被解雇.我很难理解为什么.如果有人可以向我解释这个或将我链接到我可以阅读它的资源,那将是很好的.最后我想知道是否可以添加clickhandler,之后我附加了子事件,如果建议那样.谢谢它提前寻求帮助.
裤裤
当您调用时add(),Widget.onAttach()将在正添加到面板的窗口小部件上调用.onAttach做了一些工作来注册小部件来接收事件.appendChild()简单地将一个DOM元素附加到另一个DOM元素并且不执行任 通过这样做,您应该能够在第二种情况下获取事件:
Element element = testWidget.getElement();
RootPanel.getBodyElement().appendChild(element);
DOM.sinkEvents(element,
Event.getTypeInt(ClickEvent.getType().getName())
| DOM.getEventsSunk(element);
Run Code Online (Sandbox Code Playgroud)
但是,我没有对此进行测试,我不建议您在实际应用程序中使用它.使用add()绝对是优选的,appendChild()以这种方式使用没有任何优点并且可能导致意外行为.