在commandButton之后,JSF呈现不起作用

时间:2014-04-09 15:04:36

标签: jsf primefaces

我有一个使用Primefaces 3.5的JSF应用程序。我有一个页面,在单击一个commandButton之后,我在Managed Bean中调用一个方法,它将填充一个列表,该列表将在下面的字段tblPerfis和txtPerfis中显示。

<ui:composition template="...">
    <ui:define name="content">
        <h:form id="formPrincipal">
            <br />
            <p:fieldset legend="Pesquisa de Perfil" >
                <p:panelGrid columns="2" >
                    <f:facet name="footer">
                        <p:commandButton id="btnPesquisar"
                            actionListener="#{perfilAcessoMB.pesquisar}" value="Pesquisar"
                            update="tblPerfis txtPerfis pnlPerfis"  
                            styleClass="ui-icon-search" />
                    </f:facet>
                </p:panelGrid>
            </p:fieldset>
            <br />

            <h:outputText id="txtPerfis" value="Perfis: #{perfilAcessoMB.perfis}" ></h:outputText>
            <p:dataTable id="tblPerfis" value="#{perfilAcessoMB.perfis}" var="perfil" emptyMessage="Nenhum perfil encontrado." >
                <p:column headerText="Nome">
                    <h:outputText value="#{perfil.descricao}"></h:outputText>
                </p:column>
            </p:dataTable>
            <p:outputPanel id="pnlPerfis">
                <p:fieldset id="resultadoPesquisa" legend="Resultado da Pesquisa">TESTE</p:fieldset>
            </p:outputPanel>
        </h:form>
    </ui:define>
</ui:composition>

被调用的方法如下:

@ManagedBean
@ViewScoped
public class PerfilAcessoMB {

    public void pesquisar(ActionEvent event) {
        // Fill perfis List
    }

}

原则上,它是等待的。当我想要添加渲染属性时,我的问题就出现了:

<h:outputText id="txtPerfis" value="Perfis: #{perfilAcessoMB.perfis}" rendered="#{not empty perfilAcessoMB.perfis}" ></h:outputText>
<p:dataTable id="tblPerfis" value="#{perfilAcessoMB.perfis}" rendered="#{not empty perfilAcessoMB.perfis}" var="perfil" emptyMessage="Nenhum perfil encontrado." >
    <p:column headerText="Nome">
        <h:outputText value="#{perfil.descricao}"></h:outputText>
    </p:column>
</p:dataTable>
<p:outputPanel id="pnlPerfis" rendered="#{not empty perfilAcessoMB.perfis}">
    <p:fieldset id="resultadoPesquisa" legend="Resultado da Pesquisa">TESTE</p:fieldset>
</p:outputPanel>

即使有结果,也不会显示这些字段。有人知道这里发生了什么吗?

谢谢,

Rafael Afonso

修改

根据同事的建议,我更改了代码,将dataTableoutputText放在outputPanel内。 commandButton将引用outputPanel,但rendered属性将被放入datatableoutputText

<p:commandButton id="btnPesquisar"  
    actionListener="#{perfilAcessoMB.pesquisar}" value="Pesquisar"
    update="pnlPerfis"  
    styleClass="ui-icon-search" />

<p:outputPanel id="pnlPerfis">
    <h:outputText id="txtPerfis" value="Perfis: #{perfilAcessoMB.perfis}" rendered="#{not empty perfilAcessoMB.perfis}" ></h:outputText>
    <p:dataTable id="tblPerfis" value="#{perfilAcessoMB.perfis}" rendered="#{not empty perfilAcessoMB.perfis}" var="perfil" emptyMessage="Nenhum perfil encontrado." >
        <p:column headerText="Nome">
            <h:outputText value="#{perfil.descricao}"></h:outputText>
        </p:column>
    </p:dataTable>
</p:outputPanel>

在此之后,该页面正在等待。

然而,我仍然不明白发生了什么。这种行为有什么解释?

1 个答案:

答案 0 :(得分:1)

您的问题发生是因为我们的表没有呈现它只是在您的html代码中不存在,即在此上下文中找不到更新或其他来源。

当你关闭一个更大的范围作为面板并强制进行更新时,它会强制表检查渲染的条件,如果是,则编写代码并且可以毫无问题地看到。