[RESOLVIDO] PrimeFaces update

Pessoal,
por que que tenho que colocar :j_idt7 antes nos componentes que quero dar um update?
Alguém sabe o por que, ou se consigo tirar isso?

Obrigado

Coloque um componente antes desse cara e você vai ver que esse número muda.

O JSF cria um id para cada componente de modo automático, caso você não defina um id.

Se você tiver: <input 1> <input 2> você verá que para dar update no input 1 você deverá fazer form:input 1. O form tem a opção preprendId que se você colocar igual a false, basta fazer update on input 1. O problema é que os outros componentes containers (panel, div, etc) não tem essa opção. Então se você tiver <panel 1> <input 1> <input 2> você teria que fazer o update no form:panel 1:input 1.

Ao invés de deixar :j_idt7 coloque um nome no componente.

Esse id é necessário para que o JSF consiga utilizar ajax e montar uma árvore de componente corretamente.

Isso tem a ver com os NamingContainers do JSF.

Alguns componentes do JSF implementam NamingContainer.

Essa interface indica que quando esse componente for renderizado, os componentes dentro dele terão o id relacionado a ele. exemplo:<h:form id="form"> <h:inputText id="text"> </h:form:Quando isso for renderizado, o id do inputText será :form:text porque o componente está dentro do form que é um dos NamingContainers.

Agora por que o :j_idt7? Se você não definir um id para um NamingContainer, o JSF irá gerar um automaticamente, e o nome é parecido com esse que você exemplificou.

Você pode alterar o id do componente para ficar um nome mais legível, e evitar problemas (se você alterar a tela, esse id pode ser alterado também).

no caso do form, você pode pesquisar pela propriedade prependId. Agora se for algum outro container, como o dataTable, você não terá essa opção.

Hebert e Rodrigo,
Entendi vocês perfeitamente.
Mas como irei identificar esse id gerado nesse htlm?

<ui:composition 
      xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core">
        <p:panel id="bbb" header="Lista de estados" footer="Mensagens" style="width: auto; max-width: 800px">
            <h:panelGrid id="listaEstado" columns="5" cellpadding="5">
                <p:outputLabel value="Descrição" for="tfDescricao" />
                <p:inputText id="tfDescricao" style="width: 100%;" value="#{estadoMB.descricao}"/>
                <p:commandButton value="Busca" update="cadastro,dataTable" actionListener="#{estadoMB.listByDescricao()}"/>
                <p:outputLabel value="Contém" for="cbContem" />
                <p:selectBooleanCheckbox id="cbContem" value="#{estadoMB.contem}" />
            </h:panelGrid>
            <p:dataTable id="dataTable" var="estado" value="#{estadoMB.estados}" style="width: auto;" 
                         paginator="true" rows="10" paginatorPosition="bottom"
                 paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} ">  
                <p:column style="width: 15%; overflow: hidden">  
                    <f:facet name="header">  
                        <h:outputText value="Código" />  
                    </f:facet>  
                    <h:outputText value="#{estado.id}" />  
                </p:column>  

                <p:column style="width: 60%; overflow: hidden">  
                    <f:facet name="header">  
                        <h:outputText value="Descrição" />  
                    </f:facet>  
                    <h:outputText value="#{estado.nome}" />  
                </p:column>   
                <p:column style="width: 25%; overflow: hidden"> 
                    <f:facet name="header">  
                        <h:outputText value="Opções" />  
                    </f:facet>
                    <p:commandButton update="dataTable" action="#{estadoMB.removeSelecionado()}" icon="ui-icon-disk"/>
                    <p:commandButton update=":j_idt7:cadastro" action="#{estadoMB.visualiza()}" icon="ui-icon-find" onclick="dlg3.show()"/>                   
                </p:column>
            </p:dataTable>
        </p:panel>  

        <p:dialog header="Cadastro de Estados" widgetVar="dlg3" showEffect="clip" hideEffect="explode" height="500"> 
                <h:panelGrid id="cadastro" columns="2" cellpadding="5">
                    <h:outputLabel value="Código" for="tfCodigo" />
                    <p:inputText id="tfCodigo" value="#{estadoMB.estado.id}" size="5" readonly="true"/>
                    <h:outputLabel value="Estado" for="tfNome" />
                    <p:inputText id="tfNome" value="#{estadoMB.estado.nome}"/>                
                    <h:outputLabel value="Sigla" for="tfSigla" />
                    <p:inputText id="tfSigla" value="#{estadoMB.estado.sigla}"/>
                    <h:outputLabel value="Pais" for="tfSigla" />                                  
                    <p:selectOneMenu id="tfPais" value="#{estadoMB.idPaisSelecionado}" >  
                        <f:selectItem itemLabel="Escolha um pais" itemValue=""/>  
                        <f:selectItems value="#{estadoMB.listPais()}" />  
                    </p:selectOneMenu> 
                </h:panelGrid>
                <p:commandButton value="Novo" actionListener="#{estadoMB.clear()}" id="btNovo" title="Novo país" update="cadastro"/>    
                <p:commandButton value="Salvar" actionListener="#{estadoMB.post()}" id="btSalvar" title="Salvar País" onclick="dlg3.close()"/>                
                <p:commandButton value="Buscar" actionListener="#{estadoMB.get()}" id="btBuscar" title="Buscar" update="cadastro"/>
                <p:commandButton value="Remover" actionListener="#{estadoMB.remove()}" id="btRemover" title="Remover" update="cadastro"/>
        </p:dialog>
</ui:composition>

você precisa colocar um id no seu dataTable, senão vai ter que ficar caçando qual o id que o JSF gerou.

[quote=Rodrigo Sasaki]você precisa colocar um id no seu dataTable, senão vai ter que ficar caçando qual o id que o JSF gerou.[/quote]Exato. Você não tenta descobrir. Você define um, você é quem manda. [=

Eu tenho uma dúvida, se eu der um update em um componente container, um panel por exemplo, isso quer dizer que todos os filhos dele serão atualizados também ?

[quote=lele_vader]Eu tenho uma dúvida, se eu der um update em um componente container, um panel por exemplo, isso quer dizer que todos os filhos dele serão atualizados também ?
[/quote]
Sim.

[quote=lele_vader]Eu tenho uma dúvida, se eu der um update em um componente container, um panel por exemplo, isso quer dizer que todos os filhos dele serão atualizados também ?
[/quote]Você testou? Qual foi o resultado?

Hebert e Rodrigo,

Pra mim… o dataTable tem um id, conforme a linha 15 = <p:dataTable id=“dataTable”
E o que interfere o id da dataTable no update da linha 36?

Giovani

[quote=giovani_sc]Hebert e Rodrigo,

Pra mim… o dataTable tem um id, conforme a linha 15 = <p:dataTable id=“dataTable”
E o que interfere o id da dataTable no update da linha 36?

Giovani[/quote]
Cade seu form?

Eu preciso de um form?

Se quiser executar algo do lado do servidor, precisa sim :slight_smile:

Entendi!
Desculpe.
Isso é um composition
O meu form está em outro xhtml. coloquei o id dele la e funcionou.

Hebert e Rodrigo,
Obrigado pelas dicas… foram muito valiosas.
Um bom dia pra vcs…

Esse update tem a mesma função do <p:autoComplete> ?
Na empresa onde estou de estagiário, usamos o <p:autoComplete> mas sempre
dá problemas.

Grato.
Tiago Sena

[quote=TiagoSena]Esse update tem a mesma função do <p:autoComplete> ?
Na empresa onde estou de estagiário, usamos o <p:autoComplete> mas sempre
dá problemas.

Grato.
Tiago Sena[/quote]

Não não, o p:autoComplete é um componente que faz sugestões enquanto o usuário está digitando algo.
Como se você digitasse “BR” em um campo de texto e ele sugerisse “BRASIL”.

o update define quais campos você quer que sejam renderizados novamente, ao retorno de uma requisição ajax.

[quote=TiagoSena]Esse update tem a mesma função do <p:autoComplete> ?[/quote]Desculpe, mas auto complete é para fornecer palavras ao usuário. Update é para atualizar componentes do JSF.

[quote=Rodrigo Sasaki][quote=TiagoSena]Esse update tem a mesma função do <p:autoComplete> ?
Na empresa onde estou de estagiário, usamos o <p:autoComplete> mas sempre
dá problemas.

Grato.
Tiago Sena[/quote]

Não não, o p:autoComplete é um componente que faz sugestões enquanto o usuário está digitando algo.
Como se você digitasse “BR” em um campo de texto e ele sugerisse “BRASIL”.

o update define quais campos você quer que sejam renderizados novamente, ao retorno de uma requisição ajax.[/quote]

Nossa muito bom sua explicação.
Eu também estava tendo problemas com o rendered e o update.
Valeu pois eu não sabia que era o update que setava os campos que vão ser atualizados.
Abraço.