4

我正在尝试检索 ap:dataList 中的 ah:panelGroup 的客户端 ID。

我尝试了两种方法:

1.使用component.clientId 例如:

<h:panelGroup id="listItem">
    <h:outputText value="#{component.clientId}" />
</h:panelGroup>

2.使用 p:component() 例如:

<h:panelGroup id="listItem">
    <h:outputText value="#{p:component('listItem')}" />
</h:panelGroup>

请注意,此面板组位于数据列表中。现在,两种情况下生成的客户端 ID 是不同的。(1) 没有值“listItem”附加到客户端 ID,而 (2) 在生成的 clientId 中具有值“listItem”。

此外,使用 (1) 生成的客户端 ID 与生成的 html 组件上的客户端 ID 不同。

任何人都可以对这个问题有所了解,为什么会这样?

4

2 回答 2

6

隐式 EL 对象#{component}指的是当前组件,在这种情况下

<h:outputText value="#{component.clientId}" />

本身<h:outputText>

如果您打算打印另一个组件的客户端 ID,那么您需要将组件实例绑定到视图中的唯一变量 by binding,以便您可以在同一视图中的其他任何位置引用它。

<h:panelGroup id="listItem" binding="#{listItem}">
    <h:outputText value="#{listItem.clientId}" />
</h:panelGroup>

也可以看看:

于 2013-12-12T10:03:15.370 回答
1

我的回答有两个前提:

  1. UIPanel类没有实现NamingContainer接口,因此,id of<h:panelGroup>不会以它的孩子的客户 id 结束;
  2. #{component}解析为使用此变量的当前组件。

鉴于此,在第一个片段中,您正在输出 a 的客户端 id <h:outputText>,即其命名容器的 id 加上分隔符加上其自动生成的 id(请注意,您:应该.在您的中使用错误的间隔#{component:clientId}),并且在第二个片段中您使用 EL PrimeFaces 的函数p:component,它在整个组件树中搜索具有在其参数中指定的 id 的组件,并返回找到的组件的客户端 ID。

因此,您寻找不同的组件:<h:outputText>在第一种情况和<h:panelGroup>第二种情况下,这解释了结果的差异。

在当前设置下,以下表达式将产生相同的结果:

  • #{component.parent.clientId}
  • #{p:component('listItem')}.
于 2013-12-12T10:03:43.357 回答