2017-06-08 4 views
0

Ich habe eine Wicket Komponente, die für ein Ereignis (IEvent) zu hören ist. Wenn ein solches Ereignis eintrifft, möchte ich die Komponente mit einem geänderten Modell erneut rendern. Es gibt keine aktiven Steuerelemente auf der Seite, z. B. AjaxLink, die das erneute Rendern auslösen können.Wie Rendice-Komponente nach dem Event-Empfang erneut rendern

Gibt es eine Möglichkeit, solche Komponenten zu aktualisieren?

Ich dachte, irgendwie eine AJAX Anfrage von der onEvent Methode auszulösen und eine AjaxBehavior zu der erwähnten Komponente hinzuzufügen. Aber ich weiß nicht, wie ich die AJAX-Anfrage auslösen soll.

public class PersonPanel extends Panel implements Observer { 

    private WebMarkupContainer wrapper; 

    public PersonPanel(String id) { 
     super(id); 

     setDefaultModel(new CompoundPropertyModel<PersonInfo>(getModel())); 

     wrapper = new WebMarkupContainer("wrapper"); 
     wrapper.setOutputMarkupId(true); 
     add(wrapper); 

     wrapper.add(new Label("personID")); 
     // some more content 
    } 

    private IModel<PersonInfo> getModel() { 
     return new LoadableDetachableModel<PersonInfo>() { 
      @Override 
      protected PersonInfo load() { 
       // model loading logic 
      } 
     }; 
    } 

    @Override 
    public void onEvent(IEvent<?> event) { 
     logger.debug("\n Person Panel received an Event: " + event.getPayload()); 

     // Re-rendering of "wrapper" should be triggered from here. 
    } 

    @Override 
    public void update(Observable observable, Object o) { 
     send(this, Broadcast.EXACT, "Observable cache has changed."); 
    } 
} 

Antwort

0

Hier ist die Lösung, dank von martin-g über WebSockets gelöst andeuten. Siehe die Methoden update und onEvent plus hinzugefügt WebSocketBehavior auf der Komponente:

public class PersonPanel extends Panel implements Observer { 

    private WebMarkupContainer wrapper; 

    public PersonPanel(String id) { 
     super(id); 

     setDefaultModel(new CompoundPropertyModel<PersonInfo>(getModel())); 

     wrapper = new WebMarkupContainer("wrapper"); 
     wrapper.setOutputMarkupId(true); 
     add(wrapper); 

     wrapper.add(new Label("personID")); 
     // some more content 

     add(new WebSocketBehavior() { 
     }); 

     observableCache.addObserver(this); 
    } 

    private IModel<PersonInfo> getModel() { 
     return new LoadableDetachableModel<PersonInfo>() { 
      @Override 
      protected PersonInfo load() { 
       // model loading logic 
      } 
     }; 
    } 

    @Override 
    public void onEvent(IEvent<?> event) { 
     if (event.getPayload() instanceof WebSocketPushPayload) { 
      WebSocketPushPayload wsEvent = (WebSocketPushPayload) event.getPayload(); 
      wsEvent.getHandler().add(wrapper); 
     } 
    } 

    @Override 
    public void update(Observable observable, Object o) { 
     WebSocketSettings webSocketSettings = 
      WebSocketSettings.Holder.get(getApplication()); 
     WebSocketPushBroadcaster broadcaster = 
      new WebSocketPushBroadcaster(webSocketSettings.getConnectionRegistry()); 
     broadcaster.broadcastAll(
       getApplication(), 
       new WebSocketMessage("WebSocket message from the PersonPanel.")); 
    } 

} 

Sie können ein vollständiges Laufbeispielprojekt finden, implementiert in Wicket 8 und Gradle auf Bitbucket:

0

Am send Seite können Sie die AjaxRequestTarget mit dem payload der Veranstaltung übergeben.

send(getPage(), Broadcast.DEPTH, new MyPayload(target)); 

und dann auf der Seite erhalten:

MyPayload payload = (MyPayload) event.getPayload(); 
payload.getTarget().add(this); 
+0

Ja, das ist meine Idee - aber wie erstelle ich das 'AjaxRequestTarget'? –

+0

Unter welchen Bedingungen senden Sie die Veranstaltung? Normalerweise geschieht dies in einer Aktionsmethode (wie '#onClick (AjaxRequestTarget)' ',' #onUpdate (AjaxRequestTarget) '), so dass Sie bereits das' Ziel' haben. Wenn dies keine Ajax-Anfrage ist, müssen Sie sie nicht überall hinzufügen, da die gesamte Seite neu gerendert wird. –

+0

Ich habe das Code-Snippet aktualisiert - Sie können jetzt die Methode 'update' sehen, die die' java.util.Observer'-Schnittstelle implementiert. Daher wird das Ereignis von der Komponente selbst als Reaktion auf ein Ereignis "Wicket-extern" gesendet. Der einzige verbleibende Schritt besteht darin, die Komponente ohne vollständiges Neuladen der Seite zu aktualisieren. –

Verwandte Themen