2017-03-08 9 views
0

유명한 DOM.appendChild 후에 이벤트를 잡으려고 애쓴다. 많은 사용 시도자를 시도한 후에 나는 this answer을 발견했는데 @ Õzbek은 청취자를 통해 일을했다. 그리고 "핸들러"가 아닌 "리스너"가 왜 작동하는지 이해하지 못합니다. 코드의 예를 들어 :리스너가 자신의 직업을 수행하는 동안 처리기가 작동하지 않는 이유는 무엇입니까?

Button button = new Button("Test button"); 

DOM.appendChild(getElement(), button.getElement()); 
button.addClickHandler(new ClickHandler() { 

    @Override 
    public void onClick(ClickEvent event) { 
     GWT.log("this doesn't work");   
    } 
}); 

DOM.sinkEvents(button.getElement(), Event.ONCLICK); 
DOM.setEventListener(button.getElement(), new EventListener() { 
    public void onBrowserEvent(Event event) { 
     GWT.log("this works perfectly!"); 
    } 
}); 

리스너가 작동하지만 핸들러되지 않습니다.

  1. 그래서 차이점은 무엇입니까?
  2. 강제로 처리기를 작동시키는 방법은 무엇입니까?
  3. 처리기에서이를 수행 할 수있는 방법이 있습니까?

저는 리스너와 핸들러의 차이점을 이해하려고합니다. I read these answers 큰 차이가 없다는 것을 보여 주지만 여전히 이해하지 못합니다.

답변

2

버튼은 위젯이 아니며, dom에 요소로 추가하면 이벤트를 잃게됩니다. 핸들러를 사용하려면 RootPanel에 RootPanel.get().add(button)을 추가하십시오.

위젯이 아닌 요소를 사용하려면 DOM.createButton()을 사용할 수 있고 수신기를 사용할 수 있습니다.

2

위젯은 "부착"(첨부 된 자체 위젯 또는 붙어있을 때까지 지연되는 경우) 할 때만 호출되며 버튼을 "부착"하지 않습니다.

명시 적으로 serEventListener을 사용하면 위젯 내부 (및 수명주기)를 완전히 무시할 수 있습니다. 이 경우 실제로는 ButtonElement을 사용할 수 있습니다.

TL : DR : 그렇게하지 마십시오. 깨진 디자인의 증상입니다.

+0

그러나 TextBox를 확장하고 일부 도우미를 표시하기위한 단추를 추가하려는 경우 청취자는 단 하나의 옵션 일 수 있습니다. 예를 들어 다른 옵션이없는 경우도 있습니다. –

+1

"텍스트 상자를 확장하고 버튼을 추가"하지 않으면 복합 위젯 내에서 텍스트 상자와 버튼을 작성합니다. –