Estou fazendo um form para salvar com ajax e popular um lista logo abaixo. Coisa simples.
Contudo, reparei que o getLista que uso pra carregar o dataTable é chamado 2 vezes no momento que clico no botão salvar.
A primeira vez, ele chama com se estivesse carregando a página pela primeira vez. E a segunda, o salvar em si.
Os códigos são os seguintes:
PacoteDestinoMB
@ManagedBean
public class PacoteDestinoMB {
@EJB
PacoteDestinoFacadeRemote pacoteDestinoFacade;
private List<PacoteDestino> listPacotes = null;
private PacoteDestino pacoteDestino = new PacoteDestino();
/*@PostConstruct
public void preparaDados(){
System.out.println("iniciar");
pacoteDestino = new PacoteDestino();
listPacotes = getListPacotes();
}*/
public List<PacoteDestino> getListPacotes() {
if(listPacotes == null){
listPacotes = pacoteDestinoFacade.findAll();
System.out.println("chamou lista: " + listPacotes.size());
}
return listPacotes;
}
public PacoteDestino getPacoteDestino(){
return this.pacoteDestino;
}
public void setPacoteDestino(PacoteDestino pacoteDestino) {
this.pacoteDestino = pacoteDestino;
}
public void save(){
System.out.println("salvando");
pacoteDestinoFacade.save(pacoteDestino);
pacoteDestino = null;
//listPacotes = null;
//return null;
}
public String delete(PacoteDestino pacoteDestinoExcluir){
System.out.println("apagando");
pacoteDestinoFacade.delete(pacoteDestinoExcluir);
listPacotes = null;
return null;
}
}
xhtml
<h:form class='form-horizontal form-striped'>
<h:inputHidden value="#{pacoteDestinoMB.pacoteDestino.idDestino}"/>
<div class="control-group">
<label for="textfield" class="control-label">Nome do Destino</label>
<div class="controls">
<h:inputText value="#{pacoteDestinoMB.pacoteDestino.nome}" placeholder="Destino" class="input-xlarge"/>
</div>
</div>
<div class="control-group">
<label class="control-label">Internacional<small>Selecione se este destino for internacional</small></label>
<div class="controls">
<label class='checkbox'>
<h:selectBooleanCheckbox value="#{pacoteDestinoMB.pacoteDestino.internacional}"/>
</label>
</div>
</div>
<div class="form-actions">
<h:commandButton class="btn btn-primary" value="Salvar" >
<f:ajax render="@form" listener="#{pacoteDestinoMB.save}" execute="@form" event="click" />
</h:commandButton>
<button type="button" class="btn" onclick="window.location.reload();">Cancelar</button>
</div>
<div class="box-title">
<h4>
<i class="icon-table"></i>
Destinos cadastrados
</h4>
</div>
<h:dataTable id="lista_pacotes" value="#{pacoteDestinoMB.listPacotes}" var="lista" class="table table-hover table-nomargin">
<h:column>
<f:facet name="header">Nome</f:facet>
<h:commandLink value="#{lista.nome}">
<f:ajax render="@form" listener="#{pacoteDestinoMB.setPacoteDestino(lista)}" execute="lista_pacotes" event="click"/>
</h:commandLink>
</h:column>
<h:column>
<f:facet name="header">Internacional</f:facet>
#{lista.internacional ? 'Sim' : 'Não'}
</h:column>
<h:column>
<f:facet name="header"></f:facet>
<h:commandLink class="bt_excluir" value="Excluir" onclick="return window.confirm('Deseja realmente excluir?')">
<f:ajax render="@form" listener="#{pacoteDestinoMB.delete(lista)}" execute="lista_pacotes" event="click"/>
</h:commandLink>
</h:column>
</h:dataTable>
</h:form>
Reparem que eu tentei usar o @PostConstruct, mas caiu no mesmo problema.
Outras observações interessantes:
Quando Salvo ou Excluo algum registro, tenho que setar as variáveis como null. Se não faço isso, a tabela não é atualizada com os novos dados.