我在复合组件中有以下简单代码(使用Mojarra 2.3.9/Primefaces 7(:
<composite:implementation>
<h:form id="form">
<composite:insertChildren />
<ui:fragment rendered="#{!empty cc.facets.actions}">
<div class="actions">
<composite:renderFacet name="actions" />
</div>
</ui:fragment>
</div>
</h:form>
</composite:implementation>
下面的部分用于一个页面,试图用生命来填充复合表单:
<cc:compForm id="mySpecialForm">
<f:facet name="actions">
<p:commandButton
id="myBtn"
value="Submit"
process="@form"
update="@form">
</p:commandButton>
</f:facet>
</cc:compForm>
这个表格和所有的孩子都表现得很好。但在我看来,renderFacet块中的按钮有一个错误的客户端ID,因为它不是:
mySpecialForm:form:myBtn
该按钮只获得以下客户端ID:
mySpecialForm:myBtn
这导致呈现页面时出错:
找不到引用自的表达式"@form"的组件"mySpecialForm:myBtn"。:org.timefaces.expression.ComponentNotFoundException:找不到从引用的表达式"@form"的组件"mySpecialForm:myBtn"。
是我做错了什么,还是这是JSF/Primefaces中的一个错误?我还尝试将componentType配置为从UIForm扩展的@FacesComponent,但在这种情况下,根本不会呈现任何表单。
更新1:
我试图创建一个"最小的,可复制的例子(reprex(",就像Kukeltje提到的那样。所有需要的是web应用程序中的这两个部分(两个文件都在资源中(:
cc/compForm.xhtml:
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:composite="http://xmlns.jcp.org/jsf/composite">
<composite:interface name="compForm" displayName="A composite form">
<composite:facet name="actions" />
</composite:interface>
<composite:implementation>
<h:form id="form">
<composite:insertChildren />
<composite:renderFacet name="actions" />
</h:form>
</composite:implementation>
</html>
compFormTest.xhtml:
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:cc="http://xmlns.jcp.org/jsf/composite/cc">
<cc:compForm id="mySpecialForm">
<h:inputText id="inputParam" value="" />
<f:facet name="actions">
<h:commandButton id="myBtn" value="Test" />
</f:facet>
</cc:compForm>
</html>
所有要做的就是调用.xhtml页面:http://localhost/YOUR_APP/compFormTest.xhtml.
在使用它之后(至少在MojarraJSF实现中(,输入字段具有以下正确的客户端ID mySpecialForm:form:inputParam。但是命令按钮检索表单之外的另一个客户端ID:mySpecialForm:myBtn,从我的角度来看,这是一个关于JSF VDL的错误:"…将在复合组件VDL视图中呈现。"。
但是,当我浏览示例文件时,这显然不是素数面的问题,因为如果使用标准的h:commandButton组件,也会包含错误的客户端ID。
也许有人可以在MyFaces环境中使用上面提到的2个文件来检查行为是否不同或相同?
或者有人在想变通办法吗?使用额外的@FacesComponent并将按钮从facet移动到表单下的正确位置会导致以下"有趣"的重复ID错误:
"不能两次添加同一组件:mySpecialForm:form:myBtn">(至少客户端ID是我最初期望的(
请检查您的<h: 形式id=";形式">在您的实施中。这很可能会导致表单ID重复的问题。
您可以尝试定义一个";id";组件中的阿曲丁烯
<composite:interface>
<composite:attribute name="id" required="true" />
</composite:interface>
在您的组件中,使用定义的ID如下:
<h:form id="#{cc.attrs.id}">
最后,在客户端视图中定义id atribute:
<yournamespace:yourComponent id="myFormId" />
通过这种方式,您可以从id属性派生额外的id,从而消除表单id重复。