2010-11-18 7 views
1

여러 발표자가 동일한 이벤트를 "수신 대기"하지만 각 이벤트를 발표자에게 고유하게 만들려고했습니다.연결된 여러 gwt 위젯에 대한 이벤트 차별화

Ex. 하나의 다른 탭에 각각 3 개의 Composite 위젯을 만듭니다. 그들은 모두 바인딩에서 동일한 이벤트에 첨부됩니다. "NewPrescriptionEvent"라고 부르 자. 이 이벤트가 발생하면 내 3 개의 모든 합성물이 DO으로 시도됩니다. 나는 그들 중 한 명이 그것을하기를 원한다.

이 작업을 수행하는 유일한 방법은 임시 이벤트 ID (이벤트 내부의 정수)를 작성하여 이벤트에 응답하려는 각 위젯을 확인하는 것입니다.

코드는 내가 평소을 결합 동안

private class OnNewPrescription implements NewPrescriptionHandler { 

    @Override 
    public void onNewPrescription(NewPrescriptionEvent event, int dataObjectId) { 

     if (getDataObject().getPatientId() == dataObjectId) { 
     ... 
     } 
    } 
} 

스 니펫 :

eventBus.addHandler(NewPrescriptionEvent.TYPE, new OnNewPrescription()); 

이벤트 : 나는 TYPE은 각각 다를 필요가 있다고 생각했다

public class NewPrescriptionEvent extends GwtEvent<NewPrescriptionHandler> { 

    public static final GwtEvent.Type<NewPrescriptionHandler> TYPE = new GwtEvent.Type<NewPrescriptionHandler>(); 

    private int dataObjectId; 

    public NewPrescriptionEvent(int dataObjectId) { 
     this.dataObjectId = dataObjectId; 
    } 

    @Override 
    protected void dispatch(NewPrescriptionHandler handler) { 
     handler.onNewPrescription(this, dataObjectId);  
    } 

    @Override 
    public GwtEvent.Type<NewPrescriptionHandler> getAssociatedType() { 
     return TYPE; 
    } 
} 

시간은 같지만 여전히 같은 이벤트가됩니다. 누구 제안이 있습니까?

Thx.

+0

이벤트 시스템을 사용하여 클라이언트 측 처리를 '예약'하고 있습니까? 이벤트를 처리하기 위해 _something_이 필요하면 처리를 트리거하는 이벤트 만 수신하는 다른 위젯을 작성하십시오. 이벤트 핸들러를 이벤트를 처리하지 않을 위젯에 추가하는 경우 이상한 점이 있습니다. 어쩌면 더 많은 이벤트 유형이 필요할 수도 있습니다. –

+0

동일한 이벤트를 사용하고 세 핸들러 중 하나가 실제로 어떤 작업을 수행하기를 원하는 경우 이벤트와 함께 전달 된 변수를 사용하면됩니다. 귀하의 예제 코드는 다소 엉망이 보인다. 이 문제를 해결하기위한 다른 제안을 원하십니까? 아니면 코드를 수정하는 데 도움이 필요하십니까? – dagge

답변

2

동일한 발표자의 인스턴스가 임의로 있고 모두 동일한 이벤트 유형을 듣고있는 경우가 있습니까? 그리고 각 발표자는 다른 엔티티를 통제하기 때문에 해당 엔티티에서 오는 이벤트에만 반응해야합니다. 그렇다면 내가 본 유일한 해결책은 당신이 한 것처럼 이벤트를 매개 변수화하는 것입니다.

+2

어설 션이 올바른 것으로 가정하면 올바른 답변입니다 : 동일한 위젯 유형의 여러 인스턴스. –

0

질문 제목이 귀하의 답변이라고 생각합니다.

각 위젯마다 다른 이벤트 유형이 필요합니다.

1

EventBus과 같은 소리는 아마도 여기에서 가장 좋은 방법은 아닙니다. 이것은 내가 개인적으로 가지고 있었던 가장 큰 문제 중 하나입니다. EventBus : 모든 이벤트는 글로벌이며 주어진 유형의 여러 이벤트를 구별하기 어렵습니다.

공유 EventBus없이 처리 비동기 이벤트에 대한 규칙의 좋은 세트입니다 :

  • 직접 메서드 호출을 통해 자식 위젯과 통신.
  • 콜백/처리기/수신기를 통해 상위 위젯과 통신합니다.
  • 직접 (아마 여기 지점 옆) 위젯을 형제의 지식 그래서

, 호출시의 적절한 이벤트 핸들러에 각 이벤트를 전달 각 탭에 콜백을 첨부 할 수있는 3 개의 탭이 들어있는 위젯을 피하십시오 (발표자, 귀하의 경우, 나는 믿습니다).

전역 통신이 필요하지 않으며 출처 또는 대상에 대해 알지 못하고 하나의 이벤트 유형, 하나의 재사용 가능한 탭 위젯 유형 및 탭 클래스가 단순합니다. 원칙적으로 ValueChangeHandlerCheckBox에 추가하는 것과 크게 다르지 않습니다 (결국 이벤트 버스를 통해 확인란 이벤트를 구독하지 않으므로 직접 위젯에 처리기를 추가하면됩니다).

거친 스케치 :

public class TabContainer implements IsWidget { 
    public TabContainer() { 
    tab1.addNewPrescriptionHandler(
     new NewPrescriptionEventHandler() { 
      @Override 
      public void handleNewPrescriptionEvent(NewPrescriptionEvent event) { 
      handleTab1Event(event); 
      } 
     }); 
    tab2.addNewPrescriptionHandler(
     new NewPrescriptionEventHandler() { 
      @Override 
      public void handleNewPrescriptionEvent(NewPrescriptionEvent event) { 
      handleTab2Event(event); 
      } 
     }); 
    ... 
    } 
} 

그리고 당신은 심지어 루프와 페어링과 그 단순화 할 수 있습니다.

이 컨테이너는 동일한 원리를 사용하는 다른 곳의 위젯을 ~ 위젯으로 이벤트를 보낼 수도 있습니다.

또한 Event 클래스에 포함 된 내용에 따라 Event 클래스가 필요하지 않을 수도 있습니다. 원하는 경우 콜백 및 매개 변수를 정의 할 수 있습니다.