Калитка — добавление Javascript (что лучше?)

У меня две панели в калитке.

ParentPanel и ChildPanel

Сценарий

ChildPanel является составной частью ParentPanel. Каждый раз, когда на родительской панели запускается определенное событие, я хочу добавить определенный javascript в ChildPanel.

Рабочее решение

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

По-видимому, renderHead() вызывается каждый раз, когда дочерняя панель добавляется в iPartialPageRequestHandler, и выполняет мою работу по обновлению пользовательского интерфейса при каждом событии, запускаемом в ParentPanel.

Проблема

Однако мне сказали, что это не очень хорошая практика. Поскольку в этом случае JS добавляется в renderHead(), то он попадает в исходный код страницы, что становится громоздким при отправке (больших) данных JSON. Необходимо найти хорошее место для присоединения JS к цели AJAX (возможно, render() или, возможно, лучше onRender() или onAfterRender()), только если это возможно/выполнимо в Wicket. Из-за моих ограниченных знаний я не могу предположить, как еще я могу реализовать сценарий. Любое другое (лучшее или возможное) решение приветствуется и приветствуется.

Спасибо.

Сейчас вы добавляете HeaderItem (т. е. фрагмент, который помещается в <head>) при каждом рендеринге. Если вместо этого вы хотите выполнить определенный фрагмент JS до/после добавления компонента, но не более того, вам следует взглянуть на методы IPartialPageRequestHandler.prependJavaScript и IPartialPageRequestHandler.appendJavaScript.

Jeroen Steenbeeke 19.03.2019 06:33

Я изучил эти методы. Но я могу использовать их только в том случае, если у меня есть целевой объект ajax. Это приводит меня к вопросу, в какой функции я должен добавить javascript, чтобы он вызывался каждый раз, когда дочерняя панель добавляется в обработчик запросов. Я пытаюсь реализовать метод onRender или onAfterRender, но не могу получить ajaxTarget или iPartialPageRequestHandler, которые я могу использовать для вызова метода prependJavaScript.

Sibgha 19.03.2019 19:26

Я почти уверен, что никогда не упоминал AjaxRequestTarget. Я имею в виду эти методы: ci.apache.org/projects/wicket/apidocs/8.x/org/apache/wicket/‌​… и ci.apache.org/projects/wicket/apidocs/8.x/org/apache/wicket/‌​…

Jeroen Steenbeeke 19.03.2019 21:43

Опять же, я не уверен, существуют ли они в Wicket 1.5.x или 6.x (которые вы отметили), хотя они определенно существуют в Wicket 7.x и 8.x.

Jeroen Steenbeeke 19.03.2019 21:44

Да, эти методы существуют, но могу ли я получить доступ к объекту IPartialPageRequestHandler в onRender(), чтобы я мог вызывать prependJavascript в этой функции?

Sibgha 19.03.2019 21:57

Мне нужно переопределить функцию в ChildPanel, которая вызывается каждый раз, когда она перерисовывается из ParentPanel. А также должен быть способ получить доступ к объекту iPartialPageRequestHandler, чтобы я мог вызвать для него prependJavaScript(). Я только предполагаю, что мне поможет переопределение метода onRender() с помощью iPartialPageRequestHandler. Но я не уверен, существует ли он. Также это можно сделать другим способом, кроме простого переопределения метода.

Sibgha 19.03.2019 22:04

Поскольку в ParentPanel уже есть ссылка на ChildPanel, нельзя ли решить эту проблему, просто введя свой собственный метод в ChildPanel и вызвав его из метода onClickText?

Jeroen Steenbeeke 19.03.2019 22:07

Если я это сделаю, то обновление страницы удалит javascript. Причина, по которой я ищу такую ​​функцию, как onRender(), заключается в том, чтобы убедиться, что она выполняется также при обновлении страницы после нажатия кнопки. Вы можете сказать, что после нажатия кнопки и появления JS (пример графика javascript) в пользовательском интерфейсе ChildPanel я хочу сохранить его, даже при обновлении страницы, пока не будет нажата следующая кнопка. На следующей кнопке я снова хочу обновить Javascript на основе щелчка и изменить пользовательский интерфейс. Опять же, при обновлении пользовательский интерфейс (JavaScript) должен сохраняться.

Sibgha 19.03.2019 22:17

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

Sibgha 19.03.2019 22:18
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
9
1 108
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предполагаю, что проблема в том, что createSomeJavascript создает большой кусок кода?

Затем я бы реорганизовал его так, чтобы createSomeJavascript просто вызывал функцию, которую вы добавляете к компоненту с помощью JavaScriptResourceReference. Таким образом, в исходный код попадает лишь небольшая часть кода Javascript.

Например, поместите свой javascript во внешний файл следующим образом:

private static final ResourceReference  JS_QM   = new JavaScriptResourceReference( ClientPanel.class, "question.mark.js" );


@Override
public void renderHead( Component component, IHeaderResponse response )
{
    super.renderHead( component, response );
    response.render( JavaScriptReferenceHeaderItem.forReference( JS_QM, "question-mark" ) );
    ...
}

Как добавить функцию javascript в компонент с помощью JavaScriptResourceReference?

Sibgha 20.03.2019 17:12

Если я реорганизую свою функцию так, как вы предложили, я все равно буду передавать большой кусок данных при вызове функции. Это функция рендеринга диаграмм, и ей нужны массивы данных для отображения в виде кривой обучения. Вам не кажется, что проблема останется прежней?

Sibgha 20.03.2019 18:02

Ах (вы можете улучшить свой вопрос с помощью этой информации :). Если это ваша проблема, вы можете использовать библиотеку диаграмм, которая может динамически извлекать данные (например, через ajax), и использовать Behaviour с URL-адресом обратного вызова, который доставит вам данные. Просто передайте URL-адрес обратного вызова и позвольте JS получить свои собственные данные.

Rob Audenaerde 21.03.2019 08:51

Возможно, проверьте это для вдохновения: github.com/adessoAG/злые диаграммы

Rob Audenaerde 21.03.2019 08:52

Другие вопросы по теме