19

JSF 2.0 是否有用于查找另一个组件的客户端 ID 的内置方法?SO上有大约一千个与客户端ID相关的问题,并且有很多hackish方法可以做到这一点,但我想知道JSF 2.0是否带来了一种我不知道的更简单的方法。

#{component.clientId}评估为给定组件自己的客户端 ID,但我想引用另一个组件的 ID。

这篇博文提到component.clientId,它也说#{someComponent.clientId}有效,但据我所知,它没有。我相信他是在 JSF 2.0 的任何参考实现出现之前写的,所以他只是通过 JSR,也许功能发生了变化。我不知道。

我知道 PrimeFaces 和 RichFaces 都有自己的函数来返回客户端 ID,但我只是想知道是否有内置的 JSF 2.0 方法来解决这个问题。这里有些例子:

这可以返回 outputText 的 ID。

`<h:outputText value="My client ID : #{component.clientId}" />`

根据上面的博客文章,这应该有效,但事实并非如此。我只是没有输出。

`<h:button id="sampleButton" value="Sample" />`

`<h:outputText value="sampleButton's client ID : #{sampleButton.clientId}" />`

这适用于 PrimeFaces:

`<h:outputText value="PrimeFaces : sampleButton's client ID : #{p:component('sampleButton')}" />` 

在 RichFaces 中工作:

`<h:outputText value="RichFaces : sampleButton's client ID : #{rich:clientId('sampleButton')}" />`

此外,如果可能的话,我正在寻找在更改javax.faces.SEPARATOR_CHAR值或在引用组件之外添加/删除容器时不会中断的解决方案。我花了很多时间来追踪由硬编码 ID 路径引起的问题。

4

3 回答 3

35

您需要通过binding属性在视图范围内为组件分配一个变量名称。

<h:button id="sampleButton" binding="#{sampleButton}" value="Sample" />
<h:outputText value="sampleButton's client ID : #{sampleButton.clientId}" />
于 2012-08-26T01:32:48.093 回答
1

这对我有用。我很想知道写这样的回复是否可以。

客户端.html

<h:outputText value="#{UIHelper.clientId('look-up-address-panel-id')}" />

UIHelper.java

@ManagedBean(name = "UIHelper", eager = true)
@ApplicationScoped
public class UIHelper
{

public String clientId(final String id)
{
  FacesContext context = FacesContext.getCurrentInstance();
  UIViewRoot root = context.getViewRoot();
  final UIComponent[] found = new UIComponent[1];
  root.visitTree(new FullVisitContext(context), new VisitCallback()
  {
    @Override
    public VisitResult visit(VisitContext context, UIComponent component)
    {
      if (component.getId().equals(id))
      {
        found[0] = component;
        return VisitResult.COMPLETE;
      }
      return VisitResult.ACCEPT;
    }
  });
  return found[0] == null ? "" : "#" + found[0].getClientId().replace(":", "\\\\:");
}

}
于 2013-11-14T18:04:54.737 回答
1

因为这是我的谷歌搜索的第一个结果之一,我想知道为什么我得到了一个

javax.el.PropertyNotFoundException(找不到属性“itemId”[...])

在尝试接受的解决方案时,我想分享我的 JSF 1.2 解决方案:

UIComponent方法getClientId需要一个FacesContext参数(参见UIComponent 文档)。因此,添加一个绑定到支持 bean 以及另一个返回 clientId 的方法:

xhtml:

<h:button id="sampleButton" binding="#{backingBean.sampleButton}" value="Sample" />
<h:outputText value="sampleButton's client ID : #{backingBean.sampleButtonClientId}" />

豆:

private UIComponent sampleButton;

public UIComponent getSampleButton() {
    return sampleButton;
}

public void setSampleButton(final UIComponent sampleButton) {
    this.sampleButton = sampleButton;
}

public String getSampleButtonClientId() {
    final FacesContext context = FacesContext.getCurrentInstance();
    return sampleButton.getClientId(context);
}

请注意,您将组件绑定到的 bean 应该是请求范围的,否则您最终可能会得到一个java.lang.IllegalStateException (duplicate Id for a component)(与本主题相比)。

于 2014-01-22T12:54:01.800 回答