我有两个Wicket面板。
ParentPanel
和ChildPanel
场景
ChildPanel
是ParentPanel
的一个组件。
每当父面板中发生某个事件时,我想在ChildPanel
中添加一些特定的JavaScript代码。
有效解决方案
ParentPanel.java
public class ParentPanel extends Panel
{
private static final long serialVersionUID = 4306746527837380863L;
private final ChildPanel childPanel;
public ParentPanel(String aId, IModel<AnnotatorState> aModel)
{
super(aId);
model = aModel;
// initially the Child panel is empty. passing empty model
childPanel = new ChildPanel("child-container", Model.of());
childPanel.setOutputMarkupId(true);
add(childPanel);
}
@OnEvent
public void onClickText(RenderEvent aEvent)
{
LOG.trace("Event Fired");
IPartialPageRequestHandler iPartialPageRequestHandler = aEvent.getRequestHandler();
Integer someData = getSomeData();
childPanel.setDefaultModel(Model.of(someData));
//I am trying to add the child panel to the ajax target to ensure rerendering of child panel.
iPartialPageRequestHandler.add(childPanel);
}
}
ChildPanel.java
public class ChildPanel extends Panel
{
private static final long serialVersionUID = -3849226240909011148L;
private static final Logger LOG = LoggerFactory.getLogger(ChildPanel.class);
private IModel<Integer> model;
public ChildPanel(String aId, IModel<Integer> aModel)
{
super(aId);
model = (aModel);
}
@Override
public void renderHead(IHeaderResponse aResponse)
{
super.renderHead(aResponse);
model = (IModel<Integer>) getDefaultModel();
if (model == null)
return;
Integer someData = model.getObject();
String someJavascript = createSomeJavascript(someData);
log.debug("Rendering Updated UI with the JS: ", javascript);
aResponse.render(OnDomReadyHeaderItem.forScript(javascript));
}
}
显然,每次将childPanel添加到iPartialPageRequestHandler时都会调用renderHead()方法,并更新UI以响应ParentPanel
中的每个事件。
问题
然而,有人告诉我这不是一个好习惯。因为在这种情况下,JS被添加到renderHead()中,它最终会出现在页面源代码中-当发送(大量)JSON数据时,这变得很繁琐。需要找到一个好的位置来将JS附加到AJAX目标上(也许是render(),或者更好的是onRender()或onAfterRender()),只要在Wicket中可能/可行。由于我的知识有限,我无法猜测如何实现场景。欢迎和赞赏任何其他(更好或可能)的解决方案。
谢谢。
<head>
中的片段)。如果你想要做的是在添加组件之前/之后执行某个特定的JS代码,那么你应该查看IPartialPageRequestHandler.prependJavaScript
和IPartialPageRequestHandler.appendJavaScript
方法。 - Jeroen Steenbeeke