我在尝试更新外部表单时遇到问题。为了更清楚,我有一个主要表单,包括2个不同的复合组件,让我们调用include1和include2。我要更新的页面是从include1搜索后更新的include2。
这就是包含2页的方式。
<ui:define name="include1">
<ui:param name="mbean" value="#{currentBean}" />
<libcomp:include1 />
</ui:define>
<ui:define name="include2">
<ui:param name="mbean" value="#{currentBean}" />
<libcomp:include2>
</ui:define>
现在,在include1中,我有一个按钮,尝试更新include2
中的表单update="include2Form"
在include2中我有
<cc:implementation>
<h:form
id="include2Form">
当我尝试加载页面时,我总是得到一个错误500,说&#34; include2Form&#34;还没找到!
在来到这里之前我尝试了一些研究,但没有人帮助我,我试图将表单更改为div,尝试通过参数,面板,prependId = false等表单传递id ...
使用fireBug我发现JSF或Primefaces正在向我的表单/组件ID中添加一个随机字符串...作为
ID =&#34; j_idt99:include2Form:myTable的&#34;
我认为这就是我遇到问题的原因,我试图找到一个解决方法。
有人可以帮我吗???
答案 0 :(得分:1)
首先,您的ID中的附加字符串直接来自JSF,与PrimeFaces无关,因为Composite Component本身是UINamingContainer。这是预期的行为,甚至是必要的,因为否则当在同一视图中多次使用相同的CC时,最终会出现重复的ID冲突。
在我看来,将一个表单置于一个复合组件中是不好的设计。为了提高可重用性,只需删除该表单并使用process
,partialSubmit
,也许f:subView
等。
除此之外,你应该重新考虑你的设计。一个复合组件必须更新s.th. 外部组件可能是一个指标,复合组件并不是满足您需求的完美方法。
但是,如果你真的必须更新视图的某些部分在之外的复合组件,只需通过复合属性将要更新的内容的ID传递给CC让CC不关心更新的内容和位置
<composite:interface>
<composite:attribute name="update" required="true" />
</composite:interface>