GWT добавление ClickHandler к элементу DOM

позволяет говорят, что у меня есть пользовательский виджет, который имеет 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!");
}

}

Когда я пытаюсь добавить этот Виджет как это:

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

все прекрасно. Если я нажимаю на свою кнопку, я получаю сообщение, которое я ожидаю. Однако, если я добавляю его как это:

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

мое событие щелчка не запускается. Я - struggeling для понимания почему. Было бы хорошо, если кто-то мог бы объяснить это мне или связать меня с ресурсом, где я могу считать это. Наконец я хотел бы знать, возможно ли добавить clickhandler впоследствии, я добавил дочернее событие и если тот путь рекомендуется. Спасибо это совершенствуется для справки.

kuku

8
задан kukudas 20 June 2010 в 22:19
поделиться

1 ответ

Когда вы вызываете add () , Widget.onAttach () вызывается в виджете, который добавляется на панель. onAttach выполняет некоторую работу по регистрации виджета для получения событий. appendChild () просто присоединяет один элемент DOM к другому и больше ничего не делает. Вы должны иметь возможность заставить события работать во втором случае, выполнив следующие действия:

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

Однако я не тестировал это и не рекомендовал бы вам использовать это в реальном приложении. Использование add () определенно предпочтительнее, использование appendChild () таким образом не имеет преимуществ и может привести к неожиданному поведению.

7
ответ дан 5 December 2019 в 21:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: