我有一个复合组件,其中包含带有ajax的表单。我无法弄清楚的原因是它只适用于@ form / @ all渲染参数。
<cc:interface>
<cc:attribute name="radioItem"/>
<cc:attribute name="radioItems" />
<cc:attribute name="compImage" />
<cc:attribute name="compSpecification"/>
</cc:interface>
<!-- IMPLEMENTATION -->
<cc:implementation>
<h:form>
<div id="options">
<h:selectOneRadio value="#{cc.attrs.radioItem}" >
<f:selectItems value="#{cc.attrs.radioItems}" />
<f:ajax render=":details" />
</h:selectOneRadio>
</div>
<div id="details">
<h:graphicImage value="#{cc.attrs.compImage}"/>
<h:outputText value="#{cc.attrs.compSpecification}"/>
</div>
</h:form>
</cc:implementation>
我缺少什么?
答案 0 :(得分:3)
这个问题有两个方面:
您指定的是绝对客户端ID :details
,而要重新呈现的元素位于相同 UINamingContainer
父级内,因此JSF不会能够在组件树中找到它。您需要指定相对客户端ID details
。
您已在普通的vanilla HTML元素上指定了ID而不是真正的JSF组件,因此JSF将无法在组件树中找到它。您需要使用真正的JSF组件。您需要将<div>
替换为<h:panelGroup layout="block">
。
所以,修复它们:
<h:form>
<div id="options">
<h:selectOneRadio value="#{cc.attrs.radioItem}" >
<f:selectItems value="#{cc.attrs.radioItems}" />
<f:ajax render="details" />
</h:selectOneRadio>
</div>
<h:panelGroup id="details" layout="block">
<h:graphicImage value="#{cc.attrs.compImage}"/>
<h:outputText value="#{cc.attrs.compSpecification}"/>
</h:panelGroup>
</h:form>
它适用于@form
和@all
只是因为JSF可以定位要相对于调用了ajax操作的组件重新呈现的元素,即父{{1}分别和UIForm
组件。