コンポーネントツリーをプログラムで作成している動的フォームを使用するページがあります(この質問では議論の余地がありません)レンダリングする必要がある入力コントロールの一部には、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 アンサーに基づいて、次の Bean コードがあります。
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 イベントがアプリに投稿されたことを示します。
最後に、私の質問:
プログラムで ajax JavaScript ライブラリを強制的に組み込み、現在使用している恐ろしいハックを不要にするにはどうすればよいですか?
注:「動的に生成されたコンポーネントを使用しないでください」で始まる回答には興味がありません-いくつかの理由により、これはオプションではありません。