如何在事件接收后重新渲染 Wicket 组件
How to re-render Wicket component after the Event reception
我有一个 Wicket 组件正在侦听某个事件 (IEvent
)。如果发生此类事件,我想使用更改后的模型重新渲染组件。页面上没有活动控件,例如AjaxLink
,可以触发重新渲染。
有没有办法刷新这种组件?
我想以某种方式触发来自 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.");
}
}
在send
这边你可以通过AjaxRequestTarget
和事件的payload
。
send(getPage(), Broadcast.DEPTH, new MyPayload(target));
然后在接收端:
MyPayload payload = (MyPayload) event.getPayload();
payload.getTarget().add(this);
这是解决方案,感谢 martin-g 的提示,通过 WebSockets 解决。查看方法update
和onEvent
,加上组件上的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."));
}
}
您可以在 Bitbucket 上的 Wicket 8 和 Gradle 中找到完整的 运行 示例项目:
我有一个 Wicket 组件正在侦听某个事件 (IEvent
)。如果发生此类事件,我想使用更改后的模型重新渲染组件。页面上没有活动控件,例如AjaxLink
,可以触发重新渲染。
有没有办法刷新这种组件?
我想以某种方式触发来自 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.");
}
}
在send
这边你可以通过AjaxRequestTarget
和事件的payload
。
send(getPage(), Broadcast.DEPTH, new MyPayload(target));
然后在接收端:
MyPayload payload = (MyPayload) event.getPayload();
payload.getTarget().add(this);
这是解决方案,感谢 martin-g 的提示,通过 WebSockets 解决。查看方法update
和onEvent
,加上组件上的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."));
}
}
您可以在 Bitbucket 上的 Wicket 8 和 Gradle 中找到完整的 运行 示例项目: