2016-03-23 3 views
0

Ich möchte ein Kind-Widget ein Ereignis und seine Eltern auslösen, um darauf zu reagieren. Soweit ich das verstehe, ist Widget.fireEvent für. Aber der folgende Code nicht funktioniert:Wie verwende ich GWT Widget.fireEvent?

public class EntryPointClass implements EntryPoint { 
private final HorizontalPanel horizontalPanel = new HorizontalPanel(); 
public void onModuleLoad() { 
    VerticalPanel verticalPanel = new VerticalPanel(); 
    verticalPanel.add(horizontalPanel); 
    horizontalPanel.setHeight("500px"); 
    horizontalPanel.setWidth("500px"); 
    horizontalPanel.addDomHandler(new ClickHandler() { 
     @Override 
     public void onClick(ClickEvent clickEvent) { 
      log("onClick"); 
      horizontalPanel.fireEvent(new ChangeEvent() { 
      }); 
     } 
    }, ClickEvent.getType()); 
    verticalPanel.addDomHandler(new ChangeHandler() { 
     @Override 
     public void onChange(ChangeEvent changeEvent) { 
      log("onChange"); 
     } 
    }, ChangeEvent.getType()); 
    RootPanel.get().add(verticalPanel); 
} 

private static native void log(String msg) /*-{ 
    $wnd.console.log(msg); 
}-*/; 

}

onClick wird gedruckt, aber onChange nicht. Was mache ich falsch? Oder bekomme ich den Zweck von Widget.fireEvent falsch?

+0

Ich denke, Sie sollten EventBus in Betracht ziehen. Es ist eine Klasse, die als Proxy zwischen Sender und Empfänger dient. Denken Sie daran, dass das Senden von Ereignissen ziemlich teuer ist. In einer solchen Situation würde ich nur auf Panel-Referenzen verweisen, anstatt Ereignisse zwischen ihnen zu senden. – mlewandowski

Antwort

0

Das ChangeEvent ist ein DOM-Ereignis, das angibt, dass ein Ereignis change vom Browser aus eines der dom-Elemente in diesem Widget ausgelöst wurde.

Die Klasse ist nicht dazu gedacht, Instanzen zu erstellen, die nicht durch GWTs interne Ereignisverkabelung des Browsers erstellt wurden. Aus diesem Grund müssen Sie in Ihrem Code eine Unterklasse erstellen, um eine Instanz zu erstellen. Das Feuern eines Ereignisses dieser Art führt nicht wirklich dazu, dass sich die Elemente ändern, also bin ich nicht genau sicher, was Sie im Sinn haben, indem Sie dies hier tun.

Betrachten Sie stattdessen das logische Ereignis mit ValueChangeEvent<T>, um anzuzeigen, dass ein Wert in einem Widget geändert hat, obwohl korrekt verwendet werden soll, sollte das Brennen Widget HasValueChangeHandlers<T> implementieren.


schließlich gefeuert Sie das Ereignis aus Ihrer horizontalPanel Instanz, sondern aus den verticalPanel hören, so dass Sie nicht diese gehen werden sehen. Während Browserereignisse innerhalb der dom -Elemente durchgebrannt werden (bis etwas stopPropagation() auf ihnen aufruft), feuern Sie nicht tatsächlich ein dom-Ereignis für ein Element, sondern feuern die umschlossene Klasse aus dem Widget heraus, so dass keine Blasenbildung auftritt.

+0

Aber wenn es keine Bubbling gibt, was ist der Zweck der Auslösung von Ereignissen von Widgets und nicht zu einem Event-Bus? –

+0

Sprudeln macht Sinn für dom-Elemente, wo der Browser die logische Aufschlüsselung nicht kennt (d. H. Wo ein Widget aufhört und ein anderes startet), aber Widgets definitionsgemäß sind das ein Breakdown. Die Verwendung eines Ereignisbusses für die App-weite Kommunikation macht mehr Sinn, wenn Sie Ereignisse übertragen möchten, als nach "globalen" Ereignissen zu horchen, indem Sie dem Tag ''' Handler hinzufügen. –