【问题标题】:JSF rendered is not working after commandButton在 commandButton 之后呈现的 JSF 不起作用
【发布时间】:2014-04-09 15:04:35
【问题描述】:

我有一个使用 Primefaces 3.5 的 JSF 应用程序。我有一个页面,在单击命令按钮后,我调用 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>

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

谢谢,

拉斐尔·阿方索

编辑

根据同事的建议,我将代码更改为将dataTable 和outputText 放入outputPanel。 commandButton 将引用outputPanel,但rendered 属性将放在datatable 和outputText 中。

<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>

此后,页面按等待状态工作。

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

【问题讨论】:

  • 只是因为commandButton无法更新第一次没有渲染的组件(dataTable)。

标签: jsf primefaces


【解决方案1】:

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

当您关闭更大的范围作为面板并在其中强制更新时,它会强制表格检查渲染条件,如果是,则代码已编写并且可以正常查看。

【讨论】:

  • 感谢您的回复,但请您帮助我了解如何解决此问题?谢谢
猜你喜欢
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
  • 2013-10-04
  • 2019-01-20
  • 1970-01-01
相关资源
最近更新 更多