Scope.request + keepAlive + binding dataTable

1 resposta
kirmaier

Boa tarde pessoALL,

Estou com um problema que aparentemente achei que fosse simples, mas estou já sem alternativas.

Seguinte:

Tenho um MB com o scope.REQUEST e uma rich:dataTable. Esse dataTable eu fiz um binding nesse MB, de forma que a tabela é montada (colunas, cabeçalho, registros) dentro no MB mesmo. Eu só passo o binding do dataTable para o .xhtml reRenderizar a tabela. Desta forma eu consigo renderizar várias tabelas de forma dinâmica.

Quando eu utilizo esse MB com o scope.SESSION tudo funciona 100%, mudei e os problemas começaram a aparecer.

  • A tabela não reREnderiza nem cabeçalho, colunas, muito menos registros.

Já dei reRender em tudo o que foi possivel, desde a tabela, até o componente maior no meu caso (dataTable, a4j:outputPanel e a4j:form).

Estou utilizando o a4j:keepAlive pra extender o estado do MB porque é necessário.

Tentei:

  • Toda vez que eu monto o dataTable eu: dataTable.getChildrens().clear() -> desta forma eu estaria limpando efetivamente qualquer “lixo” de tabelas anteriores. Não funcionou!
  • No getDataTable tentei inserir: FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("tabela", getListaComRegistros); -> desta forma eu inseri no .xhtml o value do datable : value="#{sessionScope['tabela']} -> E não funcionou!

Fora da tabela eu pedi pra exibir :

#{mb.dataTable.rows} -> e tem os registros ok lá, tipo 20 registros na paginação.

#{sessionScope['tabela']} -> ele exibe que possui os 20 registros.

Mas no rich:dataTable eu não consigo renderizar de forma alguma…

ALLguém pode dar uma luz aí ??? =/

Obrigado a todos.

1 Resposta

kirmaier

Consegui fazer um esquema para que as minhas informações fosse atualizadas.

Toda vez que vou no servidor atualizar a informação eu estou fazendo o seguinte:

FacesContext context = FacesContext.getCurrentInstance();
Application application = context.getApplication();

ViewHandler viewHandler = application.getViewHandler();
UIViewRoot viewRoot = viewHandler.createView(context, context.getViewRoot().getViewId());

viewRoot.createUniqueId(); //só funciona com esse createUniqueId() também, se tirar da erro de duplicação de ID.
context.setViewRoot(viewRoot);

context.renderResponse(); //ficou até opcional, com ou sem funciona.
Só que essa forma aí eu meio que perdi as funcionalidades de ajax da tela, porque toda vez ele tem que carregar TODA a página novamente =/

Alguém teria uma outra luz a respeito ???

Criado 14 de abril de 2011
Ultima resposta 15 de abr. de 2011
Respostas 1
Participantes 1