在 PrimeFaces 3.4 JSF 2.0 中按 id 查找组件

Jay*_*y K 1 jsf primefaces jsf-2

我想要一个UIComponent在 PrimeFaces 3.4 中通过 id 查找的方法。我已经找到了一个方法来执行此操作,但它有一个方法visitTree(在PrimeFaces 5.2中可用),该方法不适用于PrimeFaces 3.4。

请有人帮我在下面的 XHTML 中找到面板对象。

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui">

<h:head></h:head>
<h:body>
    <h:form id="form">
        <p:panel id="pnl"><h:outputText value="Yahoooo...."></h:outputText></p:panel>
        <p:commandButton ajax="false" value="Toggle" actionListener="#{myBean.mytoggle}"/>
    </h:form>
</h:body>
</html>
Run Code Online (Sandbox Code Playgroud)

Primefaces 5.2工作方法

public UIComponent findComponent(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];

}
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 5

UIComponent#visitTree()方法并不特定于任何 PrimeFaces 版本。它特定于 JSF 2.0。它在 JSF 2.x 之上运行的任何 PrimeFaces 版本上都应该同样有效。仅当您实际运行 JSF 1.x 时,它才会失败。

即便如此,标准 JSF API 已经提供了UIViewRoot#findComponent()这项工作,它只需要客户端 ID,而不需要组件 ID。

UIViewRoot view = FacesContext.getCurrentInstance().getViewRoot();
UIComponent component = view.findComponent("form:pnl");
// ...
Run Code Online (Sandbox Code Playgroud)

尽管如此,这对于您的问题来说是错误的解决方案。您似乎有兴趣对其进行setRendered(boolean)调用。你根本不应该这样做。您不应该对模型一侧的视图感兴趣。反过来做。您应该设置一个模型值,视图又应绑定到该模型值。

这是一个启动示例:

<h:form>
    <p:panel rendered="#{not bean.hidden}">
        <h:outputText value="Yahoooo...." />
    </p:panel>
    <p:commandButton value="Toggle" action="#{bean.toggle}" update="@form" />
</h:form>
Run Code Online (Sandbox Code Playgroud)

bean 中只有这个:

private boolean hidden;

public void toggle() {
    hidden = !hidden;
}

public boolean isHidden() {
    return hidden;
}
Run Code Online (Sandbox Code Playgroud)