jsf - registros - primefaces datatable dynamic columns
Cómo actualizar una celda específica en una tabla de datos PrimeFaces (1)
Una dataTable
es un contenedor de nombres, por lo que los componentes dentro de ella se anteponerán con la dataTable
la dataTable
. Además, cada iteración de los datos presentados en la tabla (cada fila) tendrá efecto de los id
generados. Como un formulario también es un contenedor de nombres, los id
componentes de su outputText
se generarán como formId:tabArticle:0:columnTache
en la primera fila, formId:tabArticle:0:columnTache
en la segunda fila, etc.
Si estableces una id
en tu commandButton
, obtendrás formId:tabArticle:0:myButton
, formId:tabArticle:1:myButton
etc. Puedes utilizar esta id
en tu controlador de clics para crear el inputText
clientId
correspondiente. Pero, desde que pasa el article
a un método, no puede verificar en qué botón se hizo clic. Entonces, antes que nada, cambie el método de escuchar clic a:
public void useArticle(AjaxBehaviorEvent event) {
UIComponent component = event.getComponent();
}
Ahora, usted sabe en qué botón se hizo clic ( event.getComponent()
), pero también necesita su article
. Puede configurar eso como un atributo para su botón en XHTML:
<p:commandButton id="myButton"
oncomplete="PF(''dialogTasks'').show();"
update=":formSelectAffecterTache">
<p:ajax event="click"
listener="#{myController.useArticle}" />
<f:attribute name="article"
value="#{article}" />
</p:commandButton>
Este atributo se puede leer en su oyente:
Article article = (Article) component.getAttributes().get("article");
Ahora, para actualizar inputText
, simplemente use el clientId
de clientId
del botón:
String update = component.getClientId().replace(":myButton", ":columnTache");
Guárdelo en su bean, y cuando esté listo para hacerlo, actualice:
RequestContext.getCurrentInstance().update(update);
Ver también:
En mi dataTable
estoy vinculando cada artículo con una tarea específica.
Al hacer clic en un botón de commandButton
una lista de tareas, por lo que quiero seleccionar una tarea, actualizar una celda específica en la dataTable
( outputText
con id="columnTache"
) sin actualizar el resto de mi dataTable
.
<p:dataTable value="#{myController.articleList}"
id="tabArticle"
var="article"
rowKey="#{article.id}" >
<p:column headerText="quantite" >
<pe:inputNumber value="#{article.quantite}" />
</p:column>
<p:column headerText="taches" >
<h:outputText value="#{article.tache.libelleTache}" id="columnTache" />
</p:column>
<p:column headerText="taches" >
<p:commandButton oncomplete="PF(''dialogTasks'').show();" update=":formSelectAffecterTache">
<p:ajax event="click" listener="#{myController.setArticle(article)}" />
</p:commandButton>
</p:column>
</p:dataTable>
<p:dialog header="#{bundleTech.lbl_taches}" widgetVar="dialogTasks" >
<h:panelGrid columns="1" >
<h:form id="formSelectAffecterTache">
<ui:include src="/pages/listTacheSelect.xhtml">
<ui:param name="bean" value="#{myController}" />
<ui:param name="action" value="affecterTache" />
</ui:include>
</h:form>
</h:panelGrid>
</p:dialog>
La actualización de mi dataTable
está en el bean administrado:
public void affecterTache() {
article.setTache(selectedSingleTache);
RequestContext.getCurrentInstance().update("form:tabArticle");
}