Update datatable dinamicamente [JSF2 + Primefaces]

1 resposta
A

Pessoal, quem puder ajudar eu agradeço ^^.
Estou com um aplicativo funcionando normalzin, todos os botões funcionam ok, as funcionalidades estão ok, etc… ok. Só que: Ao adicionar um item de 1 dialog, ele não atualiza o datatable que está em outro dialog, porém, eu adicionei um botão para fazer o update local no datatable, e ele da refresh e lá está o registro recém adicionado.
eis o trecho relevante:

<p:dialog widgetVar="dialog" closable="false" hideEffect="fold" onCloseUpdate="lista" resizable="false" modal="false" header="Informações" width="450">
            <h:form id="formOs">
                <h:panelGrid columns="2" id="panel" width="435" columnClasses="colunaTitulo, colunaConteudo">
                    <h:outputLabel for="dialogNumOs" value="Num O.S.:" style="width: 100px;" />
                    <h:outputText id="dialogNumOs" value="#{controle.os.numOs}" style="width: 335px;"  />

                    <h:outputLabel for="dialogAssunto" value="Assunto:" />
                    <h:outputText id="dialogAssunto" value="#{controle.os.assunto}" />

                    <h:outputLabel for="dialogResponsavel" value="Responsável:" />
                    <h:outputText id="dialogResponsavel" value="#{controle.os.funFuncionario.nomeGuerra}" />

                    <h:outputLabel for="dialogData" value="Data:" />
                    <h:outputText id="dialogData" value="#{controle.os.data}">
                        <f:convertDateTime pattern="dd/MM/yyyy"/>
                    </h:outputText>

                    <h:outputLabel for="dialogStatus" value="Status:" />
                    <h:outputText id="dialogStatus" value="#{controle.os.status}" />

                    <h:outputLabel for="dialogTipoServico" value="Tipo do Serviço:"/>
                    <h:outputText id="dialogTipoServico" value="#{controle.os.tipoServico}" />

                    <h:outputLabel for="dialogDescricao" value="Descrição:" />
                    <h:outputText id="dialogDescricao" value="#{controle.os.descricao}" />
                </h:panelGrid>
                <h:panelGroup>
                    <p:commandButton value="Finalizar O.S." actionListener="#{controle.finalizaOS}" ajax="true"/>
                    <p:commandButton value="Sair" onclick="dialog.hide();" update="lista"/>
                </h:panelGroup>

                <br/><br/>

                <p:panel header="Histórico" id="idPanelForm">
                    <h:form id="formHistorico">
                        <p:dataTable id="dtHistorico" var="regH"
                                     rendered="#{not empty controle.listHistoricoOS}"
                                     value="#{controle.listHistoricoOS}"
                                     emptyMessage="Sem histórico registrado">
                            <p:column style="width: 65px;">
                                <f:facet name="header">
                                    <h:outputText value="Data"/>
                                </f:facet>
                                <h:outputText value="#{regH.data}">
                                    <f:convertDateTime pattern="dd/MM/yyyy"/>
                                </h:outputText>
                            </p:column>
                            <p:column>
                                <f:facet name="header">
                                    <h:outputText value="Observação"/>
                                </f:facet>
                                <h:outputText value="#{regH.observacao}"/>
                            </p:column>
                        </p:dataTable>
                        <p:commandButton value="Adicionar Histórico" onclick="dlgHistorico.show();"  ajax="true"/>
                        <p:commandButton value="Atualizar Histórico" update="dtHistorico" ajax="true"/>
                    </h:form>
                </p:panel>
            </h:form>
        </p:dialog>

        <p:dialog widgetVar="dlgHistorico" modal="false" closable="false" onCloseUpdate="dtHistorico" header="Adicionar" hideEffect="fold" width="250">
            <h:form id="formAdicionaHistorico">
                <h:panelGrid columns="2">
                    <h:outputLabel value="Histórico: " for="reg_historico"/>
                    <p:inputTextarea rows="3" maxHeight="60" style="width: 148px;"  value="#{controle.obsHistorico}" id="reg_historico"></p:inputTextarea>

                    <h:outputLabel value="Data: " />
                    <p:calendar value="#{controle.dataHistorico}" pattern="dd/MM/yyyy"/>
                </h:panelGrid>
                <h:panelGroup>
                    <p:commandButton value="Adicionar" update="dialog:idPanelForm:formHistorico:dtHistorico" actionListener="#{controle.adicionaHistorico}" oncomplete="dlgHistorico.hide();" ajax="true"/>
                    <p:commandButton value="Cancela" onclick="dlgHistorico.hide();" ajax="true"/>
                </h:panelGroup>
            </h:form>
        </p:dialog>

eu sei que o update faz essa função, mas não sei o que q eu estou perdendo aqui.
Agradeço a ajuda aí gente!! :smiley:

1 Resposta

J

Olá Andre Froes,
Pelo que vi você tem diversos forms aninhados, me parece que o update não está considerando a sequência completa deles.
Uma boa maneira de verificar isso é ver no fonte do html gerado o id que ficou ou usar o plugin FireBug do Firefox ou inspecionar elemento no Chrome.
A princípio (se não houver mais nenhum nível de forms acima) acho que seria assim:

<p:commandButton value="Adicionar" update="formOs:formHistorico:dtHistorico" actionListener="#{controle.adicionaHistorico}" oncomplete="dlgHistorico.hide();" ajax="true"/>
Criado 29 de março de 2011
Ultima resposta 29 de mar. de 2011
Respostas 1
Participantes 2