如何通过icefaces中的组件id获取UIComponent

时间:2015-05-25 14:44:04

标签: jsf icefaces

我正在尝试访问一个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

1 个答案:

答案 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上询问是否有必要。