Posso atualizar um componente JSF a partir de um método de bean de apoio JSF?

100

Existe uma maneira de ter um JSF Backing bean causar uma atualização de um componente na página? Não estou procurando usar um componente ajax com atributo de atualização para atualizar um componente na página. Preciso acionar uma atualização de dentro de um método de bean de apoio JSF. Observe que a atualização na página pode acontecer após a conclusão desse método ou antes de sua conclusão. Estou usando o PrimeFaces, se houver uma solução que possa ser obtida usando o PrimeFaces.

Melhores Práticas
fonte
Pode acionar erro de validação: stackoverflow.com/a/14401741/1599699
Andrew,

Respostas:

183

Usando a API JSF padrão, adicione o ID do cliente a PartialViewContext#getRenderIds().

FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add("foo:bar");

Usando a API específica do PrimeFaces, use PrimeFaces.Ajax#update().

PrimeFaces.current().ajax().update("foo:bar");

Ou se você ainda não está no PrimeFaces 6.2+, use RequestContext#update().

RequestContext.getCurrentInstance().update("foo:bar");

Se acontecer de você usar a biblioteca de utilitários JSF OmniFaces , use Ajax#update().

Ajax.update("foo:bar");

Independentemente da forma, observe que esses IDs de cliente devem representar IDs de cliente absolutos que não são prefixados com o NamingContainercaractere separador, como você faria do lado da visualização em diante.

BalusC
fonte
6
Parece que não consigo fazer isso funcionar durante a fase Render Response (que, infelizmente, é onde sou forçado a colocar este código). Se eu colocar no aplicativo Invoke ou em fases anteriores, as coisas funcionam bem. Alguma solução alternativa para estar na fase de Render Response?
BestPractices
8
Não, é tarde demais. Mova o trabalho para invocar a fase de ação ou antes da fase de resposta de renderização. Chame o método por <f:ajax listener>ou<f:event type="preRenderView" listener>
BalusC
Alguma ideia de como fazer isso com o JSF 1.2? Posso fazer uma nova pergunta se a resposta for muito longa / complexa.
RinaldoPJr
@RinaldoPJr: JSF 1.2 não tem conceito de <f:ajax>. Isso foi introduzido desde o JSF 2.0. Você precisaria recorrer aos recursos específicos da biblioteca de componentes do JSF 1.2.
BalusC
@DanielK: Não faço ideia. Eu não faço Trinidad. Basta usar a abordagem padrão da API JSF se você ainda não conseguir descobrir o caminho do Trinidad.
BalusC de
9

Eu também tentei atualizar um componente de um bean / classe de apoio jsf

Você precisa fazer o seguinte após manipular o componente de IU:

FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add(componentToBeRerendered.getClientId())

É importante usar o clientId em vez do componentId (do lado do servidor) !!

Frithjof Schaefer
fonte
1

Tudo é possível apenas se houver tempo suficiente para pesquisar :)

O que tenho que fazer é como ter pessoas que itero em uma interface do usuário: repetir e exibir nomes e outros campos nas entradas. Mas um dos campos era singleSelect - A e dependendo dele atualizava o valor de outra entrada - B. even ui: repeat não tem id eu coloquei e ele apareceu na árvore DOM

<ui:repeat id="peopleRepeat"
value="#{myBean.people}"
var="person" varStatus="status">

Então, os ids no html eram algo como:

myForm:peopleRepeat:0:personType
myForm:peopleRepeat:1:personType

Do que na visualização, tenho um método como:

<p:ajax event="change"
listener="#{myBean.onPersonTypeChange(person, status.index)}"/>

E sua implementação foi no bean como:

String componentId = "myForm:peopleRepeat" + idx + "personType";
PrimeFaces.current().ajax().update(componentId);

Assim, atualizei o elemento do bean sem problemas. PF versão 6.2

Boa sorte e boa codificação :)

panayot_kulchev_bg
fonte
Se você tiver o evento de mudança de ajax no personType, transmitir a pessoa e o índice para o ouvinte de ajax é supérfluo. Você pode obter o id e o valor do evento. Mas sua solução pode ser necessária para seu caso de uso específico, mas como não há um exemplo completo (no sabor de exemplo reproduzível mínimo ), é difícil dizer.
Kukeltje