2010-11-18 12 views
1

Aynı olaya birden fazla Sunum "dinlemeyi" deniyorum, ancak her etkinliği Presenter'a özgü hale getireceğim.Çoklu ekli gwt widget'ları için olayları ayırt etme

Ex. Her birinde farklı bir sekmede 3 Kompozit pencere öğesi oluşturuyorum. Hepsi aynı olaya bağlanarak bağlanırlar. Buna "NewPrescriptionEvent" diyelim. Bu olay tetiklenirse, tüm 3 bileşiğim iş için DO'u deneyecektir. Ben sadece onlardan birini yapmasını istiyorum.

Bunu yapmamın tek yolu, olaya yanıt vermeye çalışan her bir widget'ı kontrol ettiğim bir geçici etkinlik kimliği (olayın içinde bir tam sayı) oluşturarak.

Kod her zamanki yapmak bağlama sırasında

private class OnNewPrescription implements NewPrescriptionHandler { 

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

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

pasajı:

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

olay: Ben TİP her farklı olması gerektiğini düşünüyordum

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; 
    } 
} 

zaman ama yine de aynı olay. Herhangi bir öneri var mı?

Thx.

+0

İstemci tarafı işlemeyi 'zamanlamak' için olay sistemini kullanıyorsunuz? Etkinliği işlemek için sadece _something_ öğesine ihtiyacınız varsa, yalnızca işlemi tetikleyen etkinlikleri dinleyen başka bir widget oluşturun. Olayları ele alması beklenmeyen widget'lara etkinlik işleyicileri ekliyorsanız, tuhaf bir şeyler oluyor. Belki daha fazla etkinlik türüne veya başka bir şeye ihtiyacınız vardır. –

+0

Aynı olayı kullanacaksanız ve yalnızca üç işleyiciden birinin bir şey yapmasını istiyorsanız, etkinlikle iletilen bir değişkeni kullanarak çalışacaktır. Örnek kodunuz biraz karışık görünüyor. Bu sorunu çözmek için başka öneriler mi arıyorsunuz yoksa kodunuzu düzeltmek için yardım ister misiniz? – dagge

cevap

2

Aynı sunum yapan kişinin rasgele sayıdaki örneğinizin olması ve hepsinin aynı olay türünü dinlemiş olması durumu mu? Ve sunumcularınızın her birinin farklı bir varlığa sahip olması, bu nedenle sadece o kurumdan gelen olaylara tepki vermelidir? Bu durumda, gördüğüm tek çözüm, etkinliği yaptığınız gibi parametrelendirmektir.

+2

Doğru yanıt, onaylama işleminin doğru olduğunu varsayar: aynı pencere öğesi türünün birden çok örneği. –

0

Sanırım sorunun adı senin cevabın.

Her bir widget için farklı etkinlik türlerine ihtiyacınız vardır.

1

EventBus gibi görünüyor muhtemelen burada en iyi yaklaşım değil; Bu, kişisel olarak EventBus ile yaşadığım temel sorunlardan biridir: tüm olaylar globaldir ve belirli bir türdeki farklı olaylar arasında ayrım yapmak zordur.

paylaşılan EventBus olmadan işleme asenkron olay için kuralları iyi kümesidir:

  • doğrudan yöntem çağrıları yoluyla çocuk widget ile iletişim kurun.
  • Geri çağrı/işleyici/dinleyiciler aracılığıyla bir üst pencere aracıyla iletişim kurun.
  • direkt (burada muhtemelen konunun dışında) widget'lar kardeş bilgisini Yani

, çağrıldığında, onun uygun bir olay işleyicisi için her olay gönderir her sekmeye geri aramalar ekleyebilir 3 sekme içerir widget'ı kaçının (Sunucular, senin durumunda, ben inanıyorum).

Küresel iletişim gerektirmez, kaynak veya hedef bilgisi yoktur, yalnızca bir olay türü, bir tane kullanılabilir sekme widget türü ve sekme sınıfı basit kalır. Prensip olarak, ValueChangeHandler'un bir CheckBox numarasına eklenmesinden çok farklı değil (sonuçta, etkinlik olayları aracılığıyla olayların onaylanması için abone olmuyorsa, doğrudan bir tanıtıcıyı widget'a eklersiniz).

Kaba kroki:

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); 
      } 
     }); 
    ... 
    } 
} 

Ve hatta bazı döngü ve eşleştirme ile bu basitleştirmek mümkün olabilir.

Diğer tarafa giderken, bu kapsayıcı, aynı ilkeleri kullanarak başka herhangi bir yerden olayları -'a gönderebilir.

Ayrıca, Event sınıfının ne olduğuna bağlı olarak, bir Event sınıfına bile ihtiyacınız olmayabilir; İstediğiniz zaman geri aramalarınızı ve paramlarınızı tanımlayabilirsiniz.