J'essaye de construire une table éditable pour entrer les valeurs d'un détail de commande. J'ai un riche: datatable lié à une liste, et j'ajoute dinamically des rangées à la table en ajoutant des éléments à la liste. L'entité a deux champs qui doivent être saisis manuellement, donc j'utilise h: inputTexts pour le faire, mais les valeurs entrées dans ces champs ne sont pas enregistrées dans les objets de la liste. J'ai essayé de le faire avec un riche: inplaceInput aussi (en suivant les instructions exactes sur le Exema Richfaces livedemo), en vain. Ceci est mon code:Seam: Problème de mise à jour des données dans h: inputText dans une rangée de riches: dataTable
<rich:panel>
<f:facet name="header">#{messages.DetalleOrdenCompra}</f:facet>
<h:outputLabel value="#{messages.Codigo}" for="txtCodigo" /> #{' '}
<h:inputText id="txtCodigo">
<rich:suggestionbox id="suggestionBox" for="txtCodigo"
var="consumible" fetchValue="#{consumible.conNombre}"
suggestionAction="#{ordenCompraHome.autoComplete}" minChars="1"
reRender="tablaDetOrdComp" ignoreDupResponses="true"
bypassUpdates="false">
<h:column>
<f:facet name="header">#{messages.Codigo}</f:facet>
<h:outputText value="#{consumible.conNumber}" />
</h:column>
<h:column>
<f:facet name="header">#{messages.Descripcion}</f:facet>
<h:outputText value="#{consumible.conNombre}" />
</h:column>
<a:support event="onselect" immediate="true"
ignoreDupResponses="true" bypassUpdates="false">
<f:setPropertyActionListener value="#{consumible}"
target="#{ordenCompraHome.conActual}" />
</a:support>
</rich:suggestionbox>
</h:inputText>
#{' '}
<!-- Add elements to the list -->
<a:commandButton type="button" value="#{messages.Agregar}"
action="#{ordenCompraHome.anadirSeleccionadoADetalle()}"
reRender="tablaDetOrdComp" immediate="true" />
<!-- Hitting this button after entering any values in the table below shows that the values are never updated -->
<a:commandButton type="button" value="Refrescar tabla"
reRender="tablaDetOrdComp" immediate="true" />
<br />
<br />
<rich:dataTable value="#{ordenCompraHome.detalleOrdenCompra}"
var="detOrdComp" id="tablaDetOrdComp" rowKeyVar="row">
<rich:column width="5%">
<f:facet name="header">
<h:outputText value="#"></h:outputText>
</f:facet>
<h:outputText value="#{row+1}"></h:outputText>
</rich:column>
<!-- ... more columns, just data output -->
<!-- The two following columns are user inputs -- no updates in the underlying list when entering any value, both values are always null -->
<rich:column width="10%">
<f:facet name="header">
<h:outputText value="#{messages.Cantidad}"></h:outputText>
</f:facet>
<s:decorate template="layout/edit-nolabel.xhtml">
<h:inputText value="#{detOrdComp.ordCantidad}" id="txtCantidad" required="true">
<!-- tried with both events, onblur and onviewactivated, first each on on its own, then both together, no results -->
<a:support event="onblur" reRender="columnaMonto" immediate="true"
bypassUpdates="false" ajaxSingle="true" />
<a:support event="onviewactivated" reRender="columnaMonto" immediate="true"
bypassUpdates="false" ajaxSingle="true" />
</h:inputText>
</s:decorate>
</rich:column>
<rich:column width="10%">
<f:facet name="header">
<h:outputText value="#{messages.CostoUnitario}"></h:outputText>
</f:facet>
<s:decorate template="layout/edit-nolabel.xhtml">
<h:inputText value="#{detOrdComp.ordCostoUnitario}"
id="txtCostoUnitario" required="true">
<a:support event="onblur" reRender="columnaMonto"
immediate="true" bypassUpdates="false" ajaxSingle="true" />
<a:support event="onviewactivated" reRender="columnaMonto" immediate="true"
bypassUpdates="false" ajaxSingle="true" />
</h:inputText>
</s:decorate>
</rich:column>
<!-- This column is the result of a multiplication between txtCantidad and txtCostoUnitario -- I don't get anything here since both factors are null (null values have been properly handled so 0.0 is displayed when any of the factors is null) -->
<rich:column id="columnaMonto" width="10%">
<f:facet name="header">
<h:outputText value="#{messages.Monto}"></h:outputText>
</f:facet>
<h:outputText value="#{detOrdComp.ordSubparcial}"></h:outputText>
</rich:column>
</rich:dataTable>
Bean:
// Underlying list. I used just @DataModel, then @DataModel(scope = ScopeType.PAGE), no results
@DataModel(scope = ScopeType.PAGE)
public List<OrdenCompraDetalle> getDetalleOrdenCompra() {
return detalleOrdenCompra;
}
Au lieu des s: décore j'utilisais quelque chose comme ça avant (du LIVEDEMO), mais il ne fonctionne pas, que ce soit
<rich:dataTable value="#{dataTableScrollerBean.allCars}" var="car" width="350px" columnClasses=",columns,columns,columns" rows="15" id="table" rowKeyVar="row">
<rich:column>
<f:facet name="header">
<h:outputText value="Price" />
</f:facet>
<rich:inplaceInput layout="block" value="#{car.price}"
id="inplace" required="true" selectOnEdit="true" editEvent="ondblclick">
<a4j:support event="onviewactivated" reRender="table, messages"/>
</rich:inplaceInput>
</rich:column>
Qu'est-ce que je manque ici? Toute aide serait appréciée. Merci d'avance.
Toujours pas de chance. Que detOrdComp est un itérateur (Ctrl + clic me conduit à l'interface abstraite publique java.util.Iterator), est-ce que ça a quelque chose à voir avec ça? J'ai même essayé de mettre ce contrôle inputText dans un s: decorate (avec le template edit.xhtml de seam-gen), et non, pas de chance. J'ai essayé riche: inplace input, ça ne marche pas non plus. Toute autre suggestion? Merci d'avance. – jpangamarca