f:ajax仅适用于@form或@all

时间:2011-11-14 21:16:52

标签: ajax jsf composite-component

我有一个复合组件,其中包含带有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>

我缺少什么?

1 个答案:

答案 0 :(得分:3)

这个问题有两个方面:

  1. 您指定的是绝对客户端ID :details,而要重新呈现的元素位于相同 UINamingContainer父级内,因此JSF不会能够在组件树中找到它。您需要指定相对客户端ID details

  2. 您已在普通的vanilla HTML元素上指定了ID而不是真正的JSF组件,因此JSF将无法在组件树中找到它。您需要使用真正的JSF组件。您需要将<div>替换为<h:panelGroup layout="block">

  3. 所以,修复它们:

    <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组件。