2010-06-20 39 views
8

cho phép nói rằng tôi có tiện ích con tùy chỉnh có ClickHandler. Dưới đây là ví dụ:GWT thêm ClickHandler vào phần tử 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!"); 
} 

}

Khi tôi cố gắng thêm Widget này như thế này:

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

mọi thứ đều tốt. Nếu tôi bấm vào nút của tôi, tôi nhận được thông báo tôi mong đợi. Tuy nhiên, nếu tôi thêm nó như sau:

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

sự kiện nhấp chuột của tôi không được kích hoạt. Tôi đang đấu tranh để hiểu tại sao. Sẽ rất tuyệt nếu có ai đó có thể giải thích điều này cho tôi hoặc liên kết tôi với một tài nguyên mà tôi có thể đọc nó. Cuối cùng tôi muốn biết nếu nó có thể thêm clickhandler sau đó tôi nối thêm sự kiện con và nếu cách đó được khuyến khích. Cảm ơn nó trước để được giúp đỡ.

kuku

Trả lời

7

Khi bạn gọi add(), Widget.onAttach() được gọi vào widget đang được bổ sung vào bảng điều khiển. onAttach thực hiện một số công việc để đăng ký widget để nhận các sự kiện. appendChild() chỉ cần gắn một phần tử DOM vào phần tử DOM khác và không làm gì khác. Bạn sẽ có thể để có được sự kiện làm việc trong trường hợp thứ hai bằng cách làm này:

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

Tuy nhiên, tôi đã không kiểm tra này và tôi sẽ không khuyên bạn nên sử dụng nó trong một ứng dụng thực tế. Sử dụng add() chắc chắn được ưu tiên, sử dụng appendChild() theo cách này không có lợi thế và có thể dẫn đến hành vi không mong muốn.

Các vấn đề liên quan