JSF: Ação em componente com rendered dinâmico

11 respostas
T

Olá,

Estou tendo problemas com um botão que é renderizado dinamicamente na tela, tenho uma tela com ID e Descrição, um botão Salvar e um Botão Excluir, todos dentro de um OutputPanel(Estou usando RichFaces). o botão Excluir tem a seguinte verificação: rendered="#{perfilMBean.id ne 0}". Ou seja, quando a tela é aberta para um novo registro, ele não aparece, porem, logo após o registro ser salvo, ele é renderizado na tela. Meu problema surge quando clico no botão Excluir, nem action, nem actionListener funcionam. No meu botão Salvar, estou dando um reRender no OutputPanel, pois já havia lido aqui no forum que o reRender deve ser em um dos componentes mais alto na arvore DOM. Já li em alguns foruns, para não utilizar funcões AJAX para renderizar componentes na tela. Gostaria de saber se esse problema tem alguma solução, ou, qual seria uma outra abordagem para exibir/ não exibir o componente na tela, sem perder a funcionalidade.

Abraços,
Ate+

11 Respostas

A

já tentou renderizar o form o qual eles pertencem em vez de renderizar o outputPanel?

T

Olá andii.brunetta,

Fiz o que você falou, mesmo assim não funciona, o botão é redenrizado, porem a action atribuída a ele não chega ao MBean, aqui está o código do botão:

<a4j:commandButton value="Novo" id="newButton" action="#{perfilMBean.novo}" reRender="cadastroForm" rendered="#{perfilMBean.id ne 0}"/>

Tem mais alguma idéia do que possa ser ?

Ate+
Abraços

A

posta seu codigo

T

andii.brunetta, segue o código da pagina de cadastro:

<a4j:form id="cadastroForm">
											
					<a4j:outputPanel id="cadastro" >
					
						<h:messages layout="table" globalOnly="true" styleClass="message" infoClass="messageSuccess" errorClass="messageErro"/>
						
						<h:inputHidden value="#{perfilMBean.id}" />	
												
						<h:panelGrid columns="1">
						
							<h:panelGroup>
								<h:outputText value="Descrição: " />
								<h:inputText id="descricao" value="#{perfilMBean.descricao}" size="60" />
								
							</h:panelGroup>
						
							<h:panelGroup>
								<fieldset style="padding-top: 20px; margin-top: 20px;">
									<legend style="font-weight: bold;">Permissões</legend>
							
									<div style="height: 130px; overflow: auto;">
										<h:selectManyCheckbox layout="pageDirection" value="#{perfilMBean.permissoesAssociadas}">
											<f:selectItems value="#{perfilMBean.permissoes}"/>
										</h:selectManyCheckbox>
									</div>
										
								</fieldset>
							</h:panelGroup>
							
							<h:panelGroup>
								<a4j:commandButton value="Salvar" id="salvaButton" action="#{perfilMBean.salva}" reRender="cadastroForm"/>
								<rich:spacer width="4"/>
								<a4j:commandButton value="Novo" id="newButton" action="#{perfilMBean.novo}" reRender="cadastroForm" rendered="#{perfilMBean.id ne 0}"/>
								<rich:spacer width="4"/>
							</h:panelGroup>
						
						</h:panelGrid>
						
					</a4j:outputPanel>
				</a4j:form>

o problema está no botão Novo, ele até é renderizado, porem a action não funciona, o post é feito, mas não chega no MBean. Neste trecho de código estou renderizando o Form como você falo.

Abraços,
Ate+

A

E se vc tirar o:

rendered="#{perfilMBean.id ne 0}"

do commandButton? Ele executa a action ou não?
tipo assim só pra testar deixe ele aparecer o tempo inteiro, tirando o rendered…
Se isso ainda não funcionar, poste seu bean…
caso funcione: o problema é na sua comparação

T

Olá andii.brunetta,

Quando eu removo a lógica do renderer, o botão sempre aparece e funciona, o método “novo” do meu MBean, apenas seta os valores para null e 0, logo ao clicar no botão Salvar, o id é preenchido, assim o botão Novo aparece, ao clicar nele, vejo que o submit via Ajax é dispardo, porem não chega ao MBean, quando removo o renderer, ele sempre funciona. Vejo que o problema está na montagem dos componentes de forma dinâmica, lia alguns posts e vejo muitas pessoas dizendo para renderizar o objeto pai, no caso um OuputPanel ou o Form, estou fazendo isso, mas mesmo assim, não tenho obtido um resultado que funcione.

A ideia de CRUD que preciso fazer é igual a do exemplo que eu vi em seu blog(Modal), porem, você está usando o PrimeFaces, aqui eu preciso que seja o RichFaces.

Abraços,
Ate+

A

e se vc tentar mudar a comparação para isso aqui:

rendered="#{perfilMBean.id > 0}"

Não sei se tem alguma coisa haver, mas onde eu trabalho, usamos assim (com primefaces) e funciona…

T

andii.brunetta, não funcionou, vou fazer alguns testes com o PrimeFaces.

Abraços,
Ate+

A

tá ok… se tiver problemas com o PrimeFaces dá um grito! que esse eu já conheço bem melhor que o RichFaces,
mexi pouco com o o rich, por isso não sabia te dizer exatamente o que poderia estar acontecendo!

H

Olá,

Acredito que estamos com o mesmo problema. Postei há algum tempo e por enquanto sem sucesso.

Troquei o escopo do meu bean para session e funcionou, mas acredito que não seja a melhor forma de resolver.

Conseguiu algo utilizando o PrimeFaces?

Atte.

Gustavo Belloni

A

Com PrimeFaces funciona, pq eu uso isso!
Porém os meus escopos geralmente são de Conversation!

Criado 7 de janeiro de 2011
Ultima resposta 12 de jan. de 2011
Respostas 11
Participantes 3