2

假设我rendered基本上使用的是案例陈述。我有一个输入字段的标签和消息,但我希望字段本身根据情况而变化。像这样:

<p:inputText id="foo" value="#{myBean.params[paramKey]}" 
   rendered="#{paramIsInput}" />
<p:calendar  id="foo" value="#{myBean.params[paramKey]}" 
   rendered="#{paramIsCalendar}" />

如果我这样做,那么我会收到以下错误:java.lang.IllegalStateException: Component ID j_idt64:foo has already been found in the view.

作为一种解决方法,我为每种参数类型创建了许多标签/消息并更改了它们的 ID。但这带来了我的问题。如果实际上只渲染了一个具有 id 的组件,那么在我的 jsf 文件中定义多个组件又有什么关系呢?有没有办法让他们保持所有相同的ID?

4

2 回答 2

9

JSF 组件 ID 在视图构建期间应该是唯一的,而不是仅在视图渲染期间。这样,您就可以有效地得到两个具有相同 ID 的 JSF 组件,这确实是无效的。您希望在视图构建时间之后在 JSF 组件树中有效地最终得到一个具有所需 ID 的 JSF 组件。

您可以通过在视图构建期间填充组件来实现此目的,而不是在视图渲染期间有条件地生成其 HTML 输出。您可以为此使用 JSTL<c:if>标记。

<c:if test="#{paramIsInput}">
    <p:inputText id="foo" value="#{myBean.params[paramKey]}" />
</c:if>
<c:if test="#{paramIsCalendar}">
    <p:calendar id="foo" value="#{myBean.params[paramKey]}" />
</c:if>

然而,这有一些警告:<c:if test>条件不能依赖于仅在 JSF 渲染期间才知道的变量。所以它不必依赖于varJSF 迭代组件,或者是视图范围 bean 的属性等。

也可以看看:

于 2012-08-28T17:30:44.067 回答
4

如果实际上只渲染了一个具有 id 的组件,那么在我的 jsf 文件中定义多个组件又有什么关系呢?

JSF 怎么知道只有一个组件会被渲染?您正在使用ELinrendered并且两者都可以评估为真。这是文档,它说您不能在命名容器内有重复的 id。

指定的标识符必须在所有组件(包括方面)中唯一,这些组件是作为 NamingContainer 的最近祖先 UIComponent 的后代,或者在整个组件树的范围内(如果没有这样的作为 NamingContainer 的祖先)。

-

有没有办法让他们保持所有相同的ID?

如果您仍然希望在多个组件上具有相同的 id,则需要分隔命名容器。

您可以使用PanelGrid作为命名容器。

于 2012-08-28T17:18:42.960 回答