La pregunta en StackOverflow >>

En cierta página que estoy generando por código (ver artículo) construyo en el bean una tabla en base a una lista de objetos:

HtmlPanelGrid grid = new HtmlPanelGrid();
for(MiObjeto objeto : this.getListaMiObjetos()){
HtmlPanelGroup div = new HtmlPanelGroup();
//le cuelgo componentes al div...
panel.getChildren().add(div);
}

la cual luego enlazo desde el xhtml:

<a4j:outputPanel id="idDiv" layout="block">
<h:panelGrid binding="#{bean.grid}" /> <!--binding-->
</a4j:outputPanel>

El asunto es que entre los componentes que pongo en la tabla, hay un botón que permite borrar una de sus filas, supongamos que con el método eliminarFila:

UICommandButton a4jButton = new UICommandButton();
/**expressionFactory y elContext son inyectados como en el post de más arriba*/
MethodExpression action = expressionFactory.createMethodExpression(eLContext,
"#{bean.eliminarFila("+fila.getId()+")}", null, parametros);
a4jButton.setActionExpression(action);
a4jButton.setRender("idDiv"); //id del outputPanel

si se fijan le estoy especificando la propierdad render para que la llamada ajax actualice al div que contiene la tabla.

Esto funciona, pero el problema es que los datos del response de ajax siempre vienen con la fila eliminada. Debuggeando vemos que esto se debe a que primero se llaman al getter de grid, y sólo después se llama al método eliminarFila.
(Linkeando a BalusC sólo porque su explicación de las fases está muy buena >>)

Teoría: esto se debe a que el binding se resuelve en la fase de JSF Update Model Values, la cual es anterior a la llamada al método que sucede en Invoke Application, por tanto la idea sería invertirlas.

  • con el FacesContext puedo ver que los getters de grid se están usando en RestoreView y el método en InvokeApplication, por lo que Update Model Values pareciera no tener mucho que ver…
Este sitio utiliza cookies.    Leer más
Privacidad