2017-06-08 119 views
0

我有一個Wicket正在偵聽某個事件的組件(IEvent)。如果這樣的事件到達,我想用改變後的模型重新渲染組件。頁面上沒有活動控件,如AjaxLink,它可以觸發重新呈現。如何在事件接收後重新渲染Wicket組件

有沒有辦法刷新這種類型的組件?

我在想以某種方式觸發onEvent方法中的AJAX請求,並將AjaxBehavior添加到提到的組件中。但我不知道,如何觸發AJAX請求。

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

回答

0

這裏是該溶液中,由於從martin-g暗示,通過的WebSockets解決。請參閱方法updateonEvent,以及在部件上添加WebSocketBehavior

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

} 

你可以找到一個完整的運行示例項目,在檢票實現8搖籃上到位桶:

0

send側可以與事件的​​通過AjaxRequestTarget

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

,然後在接收端:

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

是的,這是我的想法 - 但我如何創建'AjaxRequestTarget'? –

+0

您在什麼條件下播出活動?通常這發生在一些動作方法中(比如'#onClick(AjaxRequestTarget)','#onUpdate(AjaxRequestTarget)'),所以你已經有了'target'。如果這不是一個Ajax請求,那麼你不需要將它添加到任何地方,因爲整個頁面將被重新渲染。 –

+0

我已經更新了代碼片段 - 現在您可以看到更新方法,它實現了java.util.Observer接口。因此,事件從組件本身作爲對「Wicket-external」事件的反應進行廣播。剩下的唯一步驟就是刷新組件,而不用整頁重新加載。 –