如何从另一个复合组件更新复合组件表单?

时间:2014-09-11 18:59:27

标签: jsf facelets composite-component

我在尝试更新外部表单时遇到问题。为了更清楚,我有一个主要表单,包括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;

我认为这就是我遇到问题的原因,我试图找到一个解决方法。

有人可以帮我吗???

1 个答案:

答案 0 :(得分:1)

首先,您的ID中的附加字符串直接来自JSF,与PrimeFaces无关,因为Composite Component本身是UINamingContainer。这是预期的行为,甚至是必要的,因为否则当在同一视图中多次使用相同的CC时,最终会出现重复的ID冲突。

在我看来,将一个表单置于一个复合组件中是不好的设计。为了提高可重用性,只需删除该表单并使用processpartialSubmit,也许f:subView等。

除此之外,你应该重新考虑你的设计。一个复合组件必须更新s.th. 外部组件可能是一个指标,复合组件并不是满足您需求的完美方法。

但是,如果你真的必须更新视图的某些部分之外的复合组件,只需通过复合属性将要更新的内容的ID传递给CC让CC不关心更新的内容和位置

<composite:interface>
    <composite:attribute name="update" required="true" />
</composite:interface>