Wicket - 从另一个面板设置模型
Wicket - Set Model from another panel
我对 Wicket 很陌生。我在单击按钮时将模型从主面板 (MainPanel
) 添加到子面板 (ChartPanel
)。
MainPanel.java
单击按钮时,我将在更改其模型后重新添加 chartPanel。以下是我在 MainPanel
的 buttonClick 中使用的代码。这里的 onRenderAnnotations 事件是在 UI.
中的某些点击生成的
@OnEvent
public void onRenderAnnotations(RenderAnnotationsEvent aEvent)
{
LOG.trace("clicked on the annotation");
renderChart( aEvent.getRequestHandler());
}
private void renderChart(IPartialPageRequestHandler aRequestHandler)
{
MultiValuedMap<String, Double> recommenderScoreMap = getLatestScores(aRequestHandler);
Map<String,String> curveData = new HashMap<String,String>();
LearningCurve learningCurve = new LearningCurve();
for (String recommenderName : recommenderScoreMap.keySet()) {
String data = recommenderScoreMap.get(recommenderName).stream().map(Object::toString)
.collect(Collectors.joining(", "));
curveData.put(recommenderName,data);
learningCurve.setCurveData(curveData);
learningCurve.setMaximumPointsToPlot(MAX_POINTS_TO_PLOT);
}
chartPanel.setDefaultModel(Model.of(learningCurve));
// to avoid the error, A partial update of the page is being rendered
try {
aRequestHandler.add(chartPanel);
}
catch (IllegalStateException e) {
LOG.warn("Not updating the chart. " + e.toString());
setResponsePage(getPage());
}
}
ChartPanel.java
在此之后,在图表面板中,我想使用更新后的模型在图表面板中添加组件。最好的方法是什么?
我想在 class 图表面板中做这样的事情:
@Override
protected void onRender()
{
super.onModelChanged();
LearningCurve newLearningCurve = getModel().getObject();
requestTarget = ???
String js = createJavascript(newLearningCurve);
requestTarget.prependJavascript(js);
}
我的问题是,在上面的代码中如何获取请求目标,因为它不是 ajax 请求,我也没有在参数中获取它。我是否应该使用其他一些函数来获得 requestTarget。但我希望每次从任何地方更新 ChartPanel
的模型时调用它。
原谅我的无知。我已经尝试了几天,但仍然卡住了。我已经尽力解释清楚了,但如果有任何信息遗漏,请发表评论,我会立即添加。
谢谢。
您应该改写 renderHead()
:
@Override
public void renderHead(IHeaderResponse response)
{
super.renderHead(response);
response.render(OnLoadHeaderItem.forScript(
createJavascript(newLearningCurve)));
}
这样您的图表将正确显示,无论它是由于 AjaxRequest 添加还是仅在页面重新呈现时添加。
我对 Wicket 很陌生。我在单击按钮时将模型从主面板 (MainPanel
) 添加到子面板 (ChartPanel
)。
MainPanel.java
单击按钮时,我将在更改其模型后重新添加 chartPanel。以下是我在 MainPanel
的 buttonClick 中使用的代码。这里的 onRenderAnnotations 事件是在 UI.
@OnEvent
public void onRenderAnnotations(RenderAnnotationsEvent aEvent)
{
LOG.trace("clicked on the annotation");
renderChart( aEvent.getRequestHandler());
}
private void renderChart(IPartialPageRequestHandler aRequestHandler)
{
MultiValuedMap<String, Double> recommenderScoreMap = getLatestScores(aRequestHandler);
Map<String,String> curveData = new HashMap<String,String>();
LearningCurve learningCurve = new LearningCurve();
for (String recommenderName : recommenderScoreMap.keySet()) {
String data = recommenderScoreMap.get(recommenderName).stream().map(Object::toString)
.collect(Collectors.joining(", "));
curveData.put(recommenderName,data);
learningCurve.setCurveData(curveData);
learningCurve.setMaximumPointsToPlot(MAX_POINTS_TO_PLOT);
}
chartPanel.setDefaultModel(Model.of(learningCurve));
// to avoid the error, A partial update of the page is being rendered
try {
aRequestHandler.add(chartPanel);
}
catch (IllegalStateException e) {
LOG.warn("Not updating the chart. " + e.toString());
setResponsePage(getPage());
}
}
ChartPanel.java
在此之后,在图表面板中,我想使用更新后的模型在图表面板中添加组件。最好的方法是什么?
我想在 class 图表面板中做这样的事情:
@Override
protected void onRender()
{
super.onModelChanged();
LearningCurve newLearningCurve = getModel().getObject();
requestTarget = ???
String js = createJavascript(newLearningCurve);
requestTarget.prependJavascript(js);
}
我的问题是,在上面的代码中如何获取请求目标,因为它不是 ajax 请求,我也没有在参数中获取它。我是否应该使用其他一些函数来获得 requestTarget。但我希望每次从任何地方更新 ChartPanel
的模型时调用它。
原谅我的无知。我已经尝试了几天,但仍然卡住了。我已经尽力解释清楚了,但如果有任何信息遗漏,请发表评论,我会立即添加。
谢谢。
您应该改写 renderHead()
:
@Override
public void renderHead(IHeaderResponse response)
{
super.renderHead(response);
response.render(OnLoadHeaderItem.forScript(
createJavascript(newLearningCurve)));
}
这样您的图表将正确显示,无论它是由于 AjaxRequest 添加还是仅在页面重新呈现时添加。