【问题标题】:How to update a composite component form from another composite component?如何从另一个复合组件更新复合组件表单?
【发布时间】:2014-09-11 18:59:27
【问题描述】:

我在尝试更新外部表单时遇到问题。更清楚地说,我有一个包含 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,提示未找到“include2Form”!

我在来这里之前尝试了一些研究,但没有任何帮助,我尝试将表单更改为 div,尝试通过参数传递 id、面板、带有 prependId=false 的表单等...

使用 fireBug 我发现 JSF 或 Primefaces 正在向我的表单/组件 ID 添加一个随机字符串...作为

id="j_idt99:include2Form:myTable"

我认为这是我的问题的原因,我正在努力寻找解决方法。

谁能帮帮我???

【问题讨论】:

标签: jsf facelets composite-component


【解决方案1】:

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

在我看来,在复合组件内部有一个表单是糟糕的设计。要提高可重用性,只需摆脱这种形式并使用processpartialSubmit,也许是f:subView 等。

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

但是,如果您真的必须更新视图的某些部分在复合组件之外,只需通过复合属性将要更新的内容的 ID 传递给您的 CC并且让 CC 不关心更新什么、在哪里更新

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    相关资源
    最近更新 更多