错误:<f:ajax>在与composite一起使用时包含未知id:insertChildren </f:ajax>

时间:2012-03-21 23:46:14

标签: ajax jsf jsf-2 facelets composite-component

我定义了一个复合组件(实际上是几个),当我尝试重新渲染用 插入的组件时,我得到了错误提示:

<f:ajax> contains an unknown id ':contentFrm' - cannot locate it in the context of the component j_idt40

如果我只是替换:

<et:pageContent formId="contentFrm">

<h:form id="contentFrm">
<div>

然后一切正常

以下是相关代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:composite="http://java.sun.com/jsf/composite"> 

    <composite:interface>
        <composite:attribute name="styleClass" default="access-box-content alpha omega grid-12" />
        <composite:attribute name="formId" default="#{cc.attrs.id}" />
    </composite:interface>
    <composite:implementation>
        <h:form id="#{cc.attrs.formId}">
            <div class="#{cc.attrs.styleClass}">
                <composite:insertChildren/>
            </div>
        </h:form>
    </composite:implementation>
</html>

这就是我使用复合

的方法
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition id="landing" xmlns="http://www.w3.org/1999/xhtml"
                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:et="http://java.sun.com/jsf/composite/components"
                template="/layout/template.xhtml"
                xmlns:c="http://java.sun.com/jsp/jstl/core">

    <ui:define name="main-content">
        <et:pageTitle title="#{msg.trx_lastTrx}" />
        <et:tabBar formId="currentTrxFrm">    
            <et:tab bean="#{accountTransactionBacking}"
                    prompt="#{msg.trx_currentTrxs}"
                    reRender=":contentFrm"
                    tabId="1"
                    active="true"/>
        </et:tabBar>
        <et:pageContent formId="contentFrm">
                <et:tabContentPanel rendered="#{accountTransactionBacking.selectedTab ==1}">
                    <ui:include src="/app/summary/currentTrxRG.xhtml" rendered="#{accountTransactionBacking.selectedTab ==1}"/>
                </et:tabContentPanel>
        </et:pageContent>
    </ui:define>
</ui:composition>

TIA

更多测试..使用相同的组件得到相同的结果..例如下面的代码给出类似的错误(甚至用render =“:accountSummaryLines”替换render =“accountSummaryLines”)..

    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition id="landing" xmlns="http://www.w3.org/1999/xhtml"
                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:et="http://java.sun.com/jsf/composite/components"
                template="/layout/template.xhtml"
                xmlns:c="http://java.sun.com/jsp/jstl/core">

    <ui:define name="main-content">
        <et:pageTitle title="#{msg.ls_lastStatement}" />

        <et:tabBar formId="acctSummTabFrm">
            <et:tab/> 
        </et:tabBar>

            <et:pageContent formId="accountButtonsFrm">

                ....

                <et:div styleClass="accountSummaryLines" divId="lastStatementLines">
                    <ui:repeat var="row" value="#{lastStatementBacking.lines.data}">
                        <h:outputText escape="false" value="#{row}" styleClass="grid-12 lastStatementDetail"/><br></br>
                    </ui:repeat>
                </et:div>
                <et:div styleClass="access-box-footer">
                    <h:commandButton styleClass="left" action="#{lastStatementBacking.lines.prevPage}" value="#{msg.buttonPrevPage}" style="float:left;">
                        <f:ajax render="accountSummaryLines" />
                    </h:commandButton>
                    <h:commandButton styleClass="right" action="#{lastStatementBacking.lines.nextPage}" value="#{msg.buttonNextPage}">
                        <f:ajax render="accountSummaryLines" />
                    </h:commandButton>
                </et:div>
            </et:pageContent>
    </ui:define>
</ui:composition>

我得到这个特殊例子的唯一方法是使用render =“@ form”,就像这样..

                                     

1 个答案:

答案 0 :(得分:3)

无法找到它,因为复合组件本身就是NamingContainer真实有效客户端ID为:idOfComposite:contentFrm,其中idOfComposite是复合组件本身的(自动)生成ID。如果您在webbrowser中执行查看源并找到有问题的<form>,那么您会看到它。

您需要为复合组件提供固定ID

<et:pageContent id="contentFrm">

并在包含复合内容的纯HTML元素上使用此ID,例如<div><span>

<composite:implementation>
    <div id="#{cc.id}">
        <h:form>
            <div class="#{cc.attrs.styleClass}">
                <composite:insertChildren/>
            </div>
        </h:form>
    </div>
</composite:implementation>