Jsf component.clientId和p:component()生成的客户端id之间的差异

Jsf component.clientId和p:component()生成的客户端id之间的差异,jsf,primefaces,el,clientid,Jsf,Primefaces,El,Clientid,我正在尝试检索p:dataList中的h:panelGroup的客户端id 我尝试了两种方法: 1.使用component.clientId,例如: <h:panelGroup id="listItem"> <h:outputText value="#{component.clientId}" /> </h:panelGroup> 2.使用p:component()例如: 请注意,此面板组位于数据列表中。现在,在这两种情况下生成的客户端ID是

我正在尝试检索p:dataList中的h:panelGroup的客户端id

我尝试了两种方法:

1.使用component.clientId,例如:

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

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


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

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


有人能解释一下为什么会这样吗?

隐式EL对象
#{component}
指的是当前的组件,即

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

    • 我的回答有两个前提:

    • 类不实现接口,因此,
      的id不会在其子类的客户端id中结束
    • #{component}
      解析为使用此变量的当前组件
    • 根据这一点,在您输出的第一个代码段中,
      的客户机id,即其命名容器的id加上分隔符加上自动生成的id(请注意,您将
      放错了位置,该id应该是
      {component:clientId}
      ),在第二个代码段中,您使用PrimeFaces的EL函数,该函数在整个组件树中搜索id在其参数中指定的组件,并返回找到的组件的客户端id

      因此,您需要寻找不同的组件:
      在第一种情况下,和
      在第二种情况下,这解释了结果的差异

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

      • {component.parent.clientId}
      • {p:component('listItem')}

      请发布真实代码。
      {component:clientId}
      无效。
      p:component()
      不是JSTL函数,而是EL函数。要了解JSTL的确切含义,请阅读《感谢您的回复》@skuntselthanky BalusC的介绍。我最终使用了component.clientId。另外,我还注意到binding属性对我不起作用。正如我在问题中提到的,我在一个数据列表中有一个panelGroup,并且该panelGroup有一个绑定属性,如果它没有被绑定到唯一的变量(如答案中明确提到的),则可能会将视图弄乱(即,panelGroup中没有任何内容被呈现)。答案是完整的(注意:没有bean属性!),如果视图中没有
      binding=“#{listItem}”
      任何其他位置,也不在include文件或复合文件等中,那么答案应该是有效的。
      <h:outputText value="#{component.clientId}" />
      
      <h:panelGroup id="listItem" binding="#{listItem}">
          <h:outputText value="#{listItem.clientId}" />
      </h:panelGroup>