Problemas com tag render - JSF 2.0

Pessoal, tem um tempo que eu enfrento umas situações onde, após uma requisição ajax a atualização na tela não acontece…por exemplo:

<h:panelGrid id="grid" columns="3">
					
	<h:selectOneMenu id="combo1" value="#{bean.propriedadeCombo1}">
		<f:selectItems value="#{bean.listaCombo1}"/>
		<f:ajax event="change" execute="@this" listener="#{bean.ajaxCombo1}" render="combo2"/>  
	</h:selectOneMenu>	
	
	<h:selectOneMenu id="combo2" value="#{bean.propriedadeCombo2}" rendered="#{not empty bean.algumaCoisa}">
		<f:selectItems value="#{bean.listaCombo2}"/>
	</h:selectOneMenu>
	
	<a4j:commandLink action="#{bean.acaoLink}">
		<h:outputText value="link" /> 
	</a4j:commandLink>
	
</h:panelGrid>

Esse exemplo acima não funciona…o combo dois não é atualizado após o ajax disparado do combo um…mas se eu mando renderizar o grid todo, ai funciona:

<h:panelGrid id="grid" columns="3">
					
	<h:selectOneMenu id="combo1" value="#{bean.propriedadeCombo1}">
		<f:selectItems value="#{bean.listaCombo1}"/>
		<f:ajax event="change" execute="@this" listener="#{bean.ajaxCombo1}" render="grid"/>  
	</h:selectOneMenu>	
	
	<h:selectOneMenu id="combo2" value="#{bean.propriedadeCombo2}" rendered="#{not empty bean.algumaCoisa}">
		<f:selectItems value="#{bean.listaCombo2}"/>
	</h:selectOneMenu>
	
	<a4j:commandLink action="#{bean.acaoLink}">
		<h:outputText value="link" /> 
	</a4j:commandLink>
	
</h:panelGrid>

Alguém sabe pq no primeiro exemplo não funciona? Existe alguma condição para que o um componente possa sofrer uma nova renderização ou algo assim?

Dá uma olhada aqui: JSF Exemplos Simples com Ajax

Interessante o post!

No fim, ele explica o problema:

HtmlSelectOneMenu dentro do ?h:panelGroup? ? Adicionei o selectOne dentro do panelGroup pois toda vez que um objeto não é exibido e você deseja exibi-lo é necessário atualizar todo seu container. Ou seja, se o segundo selectOne (cores) estivesse no mesmo ?form?, você deveria utilizar seu ?render? em todo o form.

Se eu entendi bem, sempre que um componente não é exibido e eu desejo exibi-lo eu preciso mandar um render no conteiner desse componente…mas o que eu devo entender por “conteiner do componente”? Pelo exemplo que eu dei, imagino que o contêiner seria o panelGrid…uma vez que enviando um render nele o segundo combo aparece!

Obrigado pela resposta, jakefrog!

Digamos que é quem segura o componente.

Nesse caso form é o container. [=

Pipoca um update/render nele que você será feliz. [=

Sim, então eu entendi certo.

Valeu pela ajuda =]