gpt4 book ai didi

jsf-2 - 渲染 h :panelGroup's inside c:forEach 时 ID 错误

转载 作者:行者123 更新时间:2023-12-04 02:55:44 25 4
gpt4 key购买 nike

我有一个页面,可以在其中渲染一些 h:panelGroup 面板。这些面板在启动时作为在插件注册表中注册的插件实现。
插件 api 的一部分是一个自定义 jsf 组件,我在其中获取扩展点的注册插件并按路径包含它们的 facelet 模板:

<c:forEach items="#{pluginRegistry.getPlugins(point)}" var="extension">
<ui:include src="#{extension.path}" />
</c:forEach>

我包含面板的页面如下所示:
<h:panelGrid id="dashboard" columns="3">
<cmf:insertPageFragments point="dashboardExtensionPoint" />
</h:panelGrid>

对于每个面板,都有如下所示的 facelet 模板:
<rich:panel id="caseDetailsPanel" header="panel label">
<!-- panel content -->
</rich:panel>

现在,问题是 pluginsRegistry 返回的列表中的第一个面板在页面中呈现为具有提供的 id,例如 formId:caseDetailsPanel。其余的都生成了像 formId:j_idt223 这样的 id !!!显然,如果我想重新渲染一些面板,我不能这样做。

当环境是 jboss AS 7.1 和 JSF 2.1,richfaces 4.2.3.Final 时会发生这种情况。
当部署在 jboss-eap-6.1 上时,一切看起来都很好,但现在我不能使用这个 jboss 版本。

有关如何解决此问题的任何建议?

最佳答案

不能有多个具有相同 ID 的 JSF 组件。每个 JSF 组件都必须有一个唯一的 ID。使用JSTL动态创建JSF组件时,需要手动分配并确保唯一ID,否则JSF会丢弃提供的ID并自动生成唯一ID。

有几种方法可以实现这一点,具体取决于具体的功能需求和现有代码。

  • 使用迭代索引<c:forEach> .
    <c:forEach ... varStatus="loop">
    ...
    <rich:panel id="caseDetailsPanel_#{loop.index}" ...>

    这将生成 caseDetailsPanel_0 , caseDetailsPanel_1等,取决于当前的迭代索引。
  • 使用当前迭代项的唯一标识符。根据目前提供的信息尚不清楚您是否有任何信息,因此这里只是一个虚构的示例,假设 #{extension} 后面的类有一个 id表示技术数据库标识符的属性。
    <c:forEach ... var="extension">
    ...
    <rich:panel id="caseDetailsPanel_#{extension.id}" ...>
  • 如有必要,将 #1 或 #2 包裹在 <f:subview> 中具有唯一标识符,因此您无需修改​​包含。
    <c:forEach ... varStatus="loop">
    <f:subview id="panel_#{loop.index}">
    <ui:include ... />
    <f:subview>创建一个新的 NamingContainer围绕它,所以你最终得到 formId:panel_0:caseDetailsPanel , formId:panel_1:caseDetailsPanel等等。

  • 一个完全不同的选择是使用 <ui:repeat>而不是 <c:forEach> . <ui:repeat>不在 View 构建期间运行,而是在 View 渲染期间运行。这样物理上只有一个 <rich:panel id="caseDetailsPanel">组件树中的组件,在生成 HTML 期间多次重用,JSF 将负责使用 <ui:repeat> 生成正确的 ID。像这样的索引 formId:repeatId:0:caseDetailsPanel .但是,这反过来可能会导致 <ui:include> 出现问题。因为它也在 View 构建期间运行,因此无法获得 #{extension}在手。

    关于jsf-2 - 渲染 h :panelGroup's inside c:forEach 时 ID 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16714284/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com