我正在尝试访问一个icefaces组件,完全是一个Accordion,所以我可以从我的bean设置它的activeIndex。问题是返回的值始终为null。这是我的代码。
public static UIComponent findComponentInRoot(String id) {
UIComponent component = null;
FacesContext facesContext = FacesContext.getCurrentInstance();
if (facesContext != null) {
UIComponent root = facesContext.getViewRoot();
component = findComponent(root, id);
}
return component;
}
public static UIComponent findComponent(UIComponent base, String id) {
if (id.equals(base.getId()))
return base;
UIComponent kid = null;
UIComponent result = null;
Iterator kids = base.getFacetsAndChildren();
while (kids.hasNext() && (result == null)) {
kid = (UIComponent) kids.next();
if (id.equals(kid.getId())) {
result = kid;
break;
}
result = findComponent(kid, id);
if (result != null) {
break;
}
}
return result;
}
我将这种方法称为:
Accordion acco = (Accordion)findComponentInRoot("menuFormId:menu");
我的页面看起来像这样或者说它的一部分:
<h:form id="menuFormId">
<icecore:singleSubmit />
<ace:accordion id="menu" collapsible="true" autoHeight="false" >
<ace:accordionPane id="system" title="#{msgs.LABEL_ADMINISTRATION}"
rendered="#{navigationCtrl.functionList['GESUTAD'] or navigationCtrl.functionList['GESPROF'] or navigationCtrl.functionList['GESUTTOM'] or navigationCtrl.functionList['SYNCPRC']}">
<div class="divLinkStyle">
<ice:commandLink rendered="#{navigationCtrl.functionList['GESPROF']}" styleClass="linkMenu" action="#{navigationCtrl.redirectConsulterProfil}"
onmouseover="this.style.backgroundColor='#DEEDF8'" onmouseout="this.style.backgroundColor='#FFFFFF'">
<h:graphicImage value="../resources/images/util.png" />
<h:outputLabel value="#{msgs.LABEL_GESTION_PROFIL}" style="cursor: pointer;" />
</ice:commandLink>
</div>
...
有什么想法吗?
我的bean是会话作用域。
我正在使用icefaces 3.3.0和jsf 2.2
答案 0 :(得分:2)
您将组件ID与客户端ID混淆。您正在传递客户ID&#34; menuFormId:menu&#34;而不是组件ID&#34;菜单&#34;实用程序方法实际上是按组件ID而不是客户机ID查找组件。
只需使用UIViewRoot#findComponent()
。
public static UIComponent findComponentInRoot(String id) {
return FacesContext.getCurrentInstance().getViewRoot().findComponent(id);
}
对具体问题 无关。你在这里犯了一个设计错误。模型不应该对视图感兴趣。它应该是反过来的。将activeIndex
设置为bean属性,并以通常的方式将视图挂钩。
<ace:accordion ... activeIndex="#{bean.activeIndex}">
在任何情况下,你都试图抓住/创建/绑定/操作/支持bean类中的物理UIComponent
实例,你绝对应该停止编码,如果你是以正确的方式做事。如果您无法找到正确的方法,请在Stack Overflow上询问是否有必要。