[RESOLVIDO] Primefaces - Botão não chama método

Boa tarde.

Estou com um problema e não sei o pq.

Tenho um dialog com um dataTable dentro. Esse dataTable fica carregando toda vez que eu abro a página e isso causa lentidão, pois ele busca os dados no BD.

Eu pensei em evitar isso criando uma condicional dentro do List que popula o dataTable e essa condicional está funcionando.

Quando entro na página o sistema n carrega os dados do dataTable como eu queria, apenas carrega quando eu chamo o dialog em que o dataTable está.

Dentro do Dialog eu trabalho normalmente. Quando eu clico em sair eu devo chamar o método que “liberou” o uso do dataTable e mudar o valor do atributo. Este é o problema o botão sair não chama o método e nesse form ainda tenho mais 1 botão que está funcionando normalmente.

Segue o código:

Este botão está dentro do mesmo form que o botão Gravar, mas o Gravar funciona.

<p:commandButton value="Sair"
					actionListener="#{cadastrarCategoriaControle.carregarCategoria}"
					update=":listaCategoria:tabelaCategoria"
					oncomplete="dialogGerCategoria.hide()"/>

O método para “liberar” ou não o carregamento do dataTable.

	public void carregarCategoria(){
		System.out.println("VALOR INICIAL" + carregarListaCategoria);
		if (carregarListaCategoria == true) {
			System.out.println("Valia TRUE mudando para FALSE");
			carregarListaCategoria = false;
		}
		else if(carregarListaCategoria == false){
			System.out.println("Valia FALSE mudando para TRUE");
			carregarListaCategoria = true;
		}
	}

Detalhe, eu libero o dataTable em um menu e esse menu está funcionando a primeira vez quando clico ele muda para true a segunda ele muda para false.

Alguem sabe o pq o bottão não está funcionando?

Você não está trocando para false.

Vlw pela resposta.

Esse erro foi na hora de colar o código aqui. Aprontei um rolo dai acabou ficando assim, mas no código está certo.

Muito estranho isso, pois como você deve ter percebido coloquei alguns println() para ver se estava passando, quando clico no menu que chama esse método aparece as mensagens na tela, mas quando clico no botão nada acontece ele apenas da o update no form.

Como e esse menu ?

Como carrega os dados dele ?

[quote=lele_vader]Como e esse menu ?

Como carrega os dados dele ?[/quote]

<p:megaMenu autoDisplay="false">  
 <p:submenu label="Tabelas Diversas" icon="ui-icon-document">  
  
            <p:column>  
                <p:submenu label="Cadastrar">  
                <p:menuitem value="Categoria/Convênios" 
                oncomplete="dialogGerCategoria.show()" 
                update=":listaCategoria:tabelaCategoria" 
                actionListener="#{cadastrarCategoriaControle.carregarCategoria}"/>  
                </p:submenu> 
            </p:column>  
        </p:submenu>  
  </p:megaMenu>  

Esse é o menu. Ele apenas faz um actionListener que funciona e da um update no dialog que têm o dataTable dentro.
Por exemplo:

A primeiva vez que clico nele ele troca o valor da variável para true e apartir dai o dataTable lista os dados a segunda vez ele troca para false e o sistema para de listar o dataTable e assim quantas vezes eu clicar.

Cade o botão sair e a implementação dele.

Vou postar o dialog todo para te dar uma idea melhor de como eu fiz. Lembrando que o botão Gravar funciona perfeitamente.

[code]

<?xml version='1.0' encoding='UTF-8' ?>
Categoria/Convênio
					<h:outputLabel for="nomeCategoria" value="Nome:" />
					<h:inputText id="nomeCategoria"
						value="#{cadastrarCategoriaMB.categoria.nomeCatConv}"
						maxlength="50" size="50"
						required="true"
						requiredMessage="Nome Categoria é obrigatório." />
						<p:message for="nomeCategoria" />
						
					<h:outputLabel for="nomeCategoriaAbrev" value="Nome abreviado:" />
					<h:inputText id="nomeCategoriaAbrev"
						value="#{cadastrarCategoriaMB.categoria.nomeAbreCatConv}"
						maxlength="3" size="3" 
						required="true"
						requiredMessage="Nome Abreviado é obrigatório."/>
						<p:message for="nomeCategoriaAbrev" />
				<h:outputLabel for="textArea" value="OBS:" />
				
				</h:panelGrid>
				
				<h:inputTextarea rows="1" cols="70"
				value="#{cadastrarCategoriaMB.categoria.obs}"></h:inputTextarea>
			</p:panel>
			<h:panelGrid columns="4" columnClasses="label, value"
				styleClass="grid">
		<!-- ############################# - BOTÕES - ############################# -->		
				<p:commandButton value="Gravar"
					actionListener="#{cadastrarCategoriaControle.salvarCategoriaCliente}" 
					update="cadastroCategoria, :listaCategoria:tabelaCategoria"
					oncomplete="dialogGerCategoria.show()"/>
				
				<p:commandButton value="Limpar" 
				update="cadastroCategoria"
				actionListener="#{cadastrarCategoriaMB.inicializarObjetos}"/>
				
				<p:commandButton value="Sair"
				actionListener="#{cadastrarCategoriaControle.carregarCategoria}"
				update=":listaCategoria:tabelaCategoria"
				oncomplete="dialogGerCategoria.hide()"/>
			<!-- ########################################################## -->		
			</h:panelGrid>
		</h:form>
		
		<h:form id="listaCategoria">  
		<p:dataTable id="tabelaCategoria" 
			lazy="true"
			var="categoria"
			value="#{cadastrarCategoriaControle.listarTodasCategorias}"
			rows="5"
			paginator="true"
			emptyMessage="Nenhuma categoria/convênio cadastrada!">
			
    <p:column headerText="Código">  
        <h:outputText value="#{categoria.codigoCategoria}" />  
    </p:column>  

    <p:column headerText="Nome">  
        <h:outputText value="#{categoria.nomeCatConv}" />  
    </p:column>  

    <p:column headerText="Nome Abreviado">  
        <h:outputText value="#{categoria.nomeAbreCatConv}" />  
    </p:column>  

    <p:column headerText="Manter">  
    	<p:commandButton icon="ui-icon-close" update=":listaCategoria" actionListener="#{cadastrarCategoriaControle.deletarCategoriaCliente}"/>
        <p:commandButton icon="ui-icon-document"/> 
    </p:column>  
</p:dataTable>  

</h:form>
</p:dialog>


</h:body> [/code]

Vendo rapidamente no sair você não está atualizando o form.

Pior que estou. É pq são dois forms tentei com apenas um e tbm não funcionou. Nesse exemplo estou atualizando apenas o segundo form que é o form do dataTable.

tenta colocar um ajax=false no commandButton

Obrigado pela ajuda, mas ainda não funcionou.

Vou dar um chute:

Será que pode ser algo como “semáforo”, sei lá. hehe

Tipo o método está sendo impedido de ser acessado por outro evento?

Existe algo assim nativo do Primefaces?

Mas ainda fico com algum erro noob meu. :frowning:

<p:commandButton value="Sair" actionListener="#{cadastrarCategoriaControle.carregarCategoria}" update=":listaCategoria:tabelaCategoria" oncomplete="dialogGerCategoria.hide()" immediate="true" process="@this"/>

Insira as propriedades immediate com o valor true, pra pular toda parte de validação do formulario.
Também insira a propriedade process para apenas ser submetido este botão.

[quote=grinche] <p:commandButton value="Sair" actionListener="#{cadastrarCategoriaControle.carregarCategoria}" update=":listaCategoria:tabelaCategoria" oncomplete="dialogGerCategoria.hide()" immediate="true" process="@this"/>

Insira as propriedades immediate com o valor true, pra pular toda parte de validação do formulario.
Também insira a propriedade process para apenas ser submetido este botão.[/quote]

Muito obrigado! Agora aprendi mais duas novas propriedades. hehe

Obrigado a todos pela ajuda.

[quote=Cledsonjr]Boa tarde.

Estou com um problema e não sei o pq.

Tenho um dialog com um dataTable dentro. Esse dataTable fica carregando toda vez que eu abro a página e isso causa lentidão, pois ele busca os dados no BD.

Eu pensei em evitar isso criando uma condicional dentro do List que popula o dataTable e essa condicional está funcionando.

Quando entro na página o sistema n carrega os dados do dataTable como eu queria, apenas carrega quando eu chamo o dialog em que o dataTable está.

Dentro do Dialog eu trabalho normalmente. Quando eu clico em sair eu devo chamar o método que “liberou” o uso do dataTable e mudar o valor do atributo. Este é o problema o botão sair não chama o método e nesse form ainda tenho mais 1 botão que está funcionando normalmente.

Segue o código:

Este botão está dentro do mesmo form que o botão Gravar, mas o Gravar funciona.

<p:commandButton value="Sair"
					actionListener="#{cadastrarCategoriaControle.carregarCategoria}"
					update=":listaCategoria:tabelaCategoria"
					oncomplete="dialogGerCategoria.hide()"/>

O método para “liberar” ou não o carregamento do dataTable.

	public void carregarCategoria([u][b]ActionEvent e[/b][/u]){
		System.out.println("VALOR INICIAL" + carregarListaCategoria);
		if (carregarListaCategoria == true) {
			System.out.println("Valia TRUE mudando para FALSE");
			carregarListaCategoria = false;
		}
		else if(carregarListaCategoria == false){
			System.out.println("Valia FALSE mudando para TRUE");
			carregarListaCategoria = true;
		}
	}

Detalhe, eu libero o dataTable em um menu e esse menu está funcionando a primeira vez quando clico ele muda para true a segunda ele muda para false.

Alguem sabe o pq o bottão não está funcionando?[/quote]

não sei se você já conseguiu resolver e também não sei se é regra do JSF, mas quando tem um actionListener no seu XHTML o método requer um parâmetro ActionEvent e.

abs