如何在界面中通过组件id获取ui组件



我试图访问一个icefaces组件,确切地说一个Accordion,所以我可以从我的bean设置它的activeIndex。问题是返回值总是空的。这是我的代码。

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

您混淆了组件ID和客户端ID。你正在传递一个客户端ID"menuFormId:menu"而不是组件ID"menu"给你的实用程序方法,而实用程序方法实际上是通过组件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上询问。

相关内容

  • 没有找到相关文章

最新更新