JSF 2.0是否有内置方法来查找另一个组件的客户端ID?在SO上有大约一千个与客户端ID相关的问题,并且有很多hackish方法可以做到这一点,但我想知道JSF 2.0是否带来了一个我不知道的更简单的方法。
#{component.clientId}
评估给定组件自己的客户端ID,但我想引用另一个组件的ID。
This博客文章提及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路径引起的问题。
答案 0 :(得分:33)
您需要通过binding
属性在视图范围内为组件分配变量名称。
<h:button id="sampleButton" binding="#{sampleButton}" value="Sample" />
<h:outputText value="sampleButton's client ID : #{sampleButton.clientId}" />
答案 1 :(得分:1)
这对我有用。我很想知道写这样的回答是否可以。
client.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(":", "\\\\:");
}
}
答案 2 :(得分:1)
因为这是我谷歌搜索的第一批结果之一,我想知道为什么我有一个
javax.el.PropertyNotFoundException(未找到属性'itemId'[...])
在尝试接受的解决方案时,我想与JSF 1.2分享我的解决方案:
UIComponent
的方法getClientId
需要FacesContext
参数(请参阅UIComponent documentation)。所以添加一个绑定到backing 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)
(与this topic比较)。