Калитка - Установить модель с другой панели - PullRequest
1 голос
/ 16 марта 2019

Я новичок в Wicket. Я добавляю модель в подпанель (ChartPanel) из главной панели (MainPanel) по нажатию кнопки.

MainPanel.java

При нажатии кнопки я заново добавляю chartPanel после изменения ее модели. Ниже приведен код, который я использую в кнопке Нажмите MainPanel. Здесь событие onRenderAnnotations создается при некотором щелчке в пользовательском интерфейсе.

 @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

После этого в chartPanel я хочу использовать обновленную модель, чтобы добавить компонент в chartmap. Каков наилучший способ сделать это?

Я хочу сделать что-то подобное в классе ChartPanel:

@Override
protected void onRender()
{
    super.onModelChanged();

    LearningCurve newLearningCurve = getModel().getObject();

    requestTarget = ???

    String js = createJavascript(newLearningCurve);
    requestTarget.prependJavascript(js);
}

Мой вопрос в приведенном выше коде, как получить цель запроса, поскольку это не ajax-запрос, и я не получаю его в аргументах. Должен ли я использовать какую-то другую функцию, где я также получаю requestTarget. Но я хочу, чтобы он вызывался каждый раз, когда модель ChartPanel обновляется откуда угодно.

Прошу прощения за мое невежество. Я пытался в течение нескольких дней, но я все еще застрял. Я попытался объяснить это достаточно, но если какая-либо информация отсутствует, пожалуйста, прокомментируйте, и я добавлю это сразу.

Спасибо.

1 Ответ

2 голосов
/ 17 марта 2019

Вместо этого следует переопределить renderHead():

@Override
public void renderHead(IHeaderResponse response)
{
    super.renderHead(response);

    response.render(OnLoadHeaderItem.forScript(
            createJavascript(newLearningCurve)));
}

Таким образом, ваша диаграмма будет отображаться правильно, независимо от того, была ли она добавлена ​​из-за AjaxRequest или просто при перерисовке страницы.

...