Программно добавляя Ajax Behavior - «Мохарра не определена»
У меня есть страница с использованием динамических форм, где я создаю дерево компонентов программно (что не обсуждается в этом вопросе). Для некоторых элементов управления вводом, которые мне нужно отобразить, требуется обработчик ajax.
Фрагмент xhtml (включенный<ui:include>
из другого фрагмента) это:
<ui:composition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:p="http://xmlns.jcp.org/jsf/passthrough">
<h:panelGroup id="id_Group1" binding="#{questionaire.group1}" layout="block"/>
</ui:composition>
Основываясь на других SO anwsers, у меня есть следующий код компонента:
public HtmlPanelGroup getGroup1() {
// irrelevant code omitted
HtmlSelectOneRadio selectUI = new HtmlSelectOneRadio();
AjaxBehavior valueChangeAction = (AjaxBehavior)FacesUtils.getApplication().createBehavior(AjaxBehavior.BEHAVIOR_ID);
valueChangeAction.addAjaxBehaviorListener(new ProbeQuestionListener(currentQuestion, "probeDiv" + questionNumber));
selectUI.addClientBehavior("change", valueChangeAction);
valueChangeAction.setRender(Collections.singletonList("probeDiv" + questionNumber));
// further code to customise the control, create the panel group and probe div and wire everything together omitted
}
Это делает правильно, и я вижу:
<input type="radio" onchange="mojarra.ab(this,event,'change',0,'probeDiv2')" value="0" id="answer_1:0" name="answer_1">
Тем не менее, нажатие переключателя дает мне ошибку консоли JavaScript:reference error: mojarra is not defined
Теперь, если я изменю xhtml, чтобы включить «нормальный» элемент управления ajax, например,
<ui:composition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:p="http://xmlns.jcp.org/jsf/passthrough">
<h:panelGroup id="id_Group1" binding="#{questionaire.group1}" layout="block"/>
<!-- include a hacky hidden ajax field to force inclusion of the ajax javascript -->
<h:panelGroup layout="block" id="hiddenAjaxDiv" style="display:none">
<h:inputText id="hiddenAjax">
<f:ajax execute="hiddenAjax" render="hiddenAjaxDiv" />
</h:inputText>
</h:panelGroup>
</ui:composition>
Это работает, и сетевой монитор firebug показывает, что мое приложение ajax от переключателя размещено в приложении.
Итак, наконец, мой вопрос:
Как мне программно форсировать включение библиотеки javascript ajax и обойтись без ужасного хака, который я сейчас использую?
Примечание: меня не интересует какой-либо ответ, который начинается с «не использовать динамически генерируемые компоненты» - по нескольким причинам это не вариант.