2010-11-05 26 views
2

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.

Répondre

1

Je pense que votre problème est l'attribut ajaxSingle="true". Cet attribut signifie que, même si tous les éléments d'entrée du formulaire sont soumis, seule l'entrée qui a déclenché l'envoi sera traitée.

Si tel est le problème, vous pouvez essayer un des éléments suivants (je suppose que le préfixe a est le préfixe a4j commun?):

  • Ajoutez l'ID de l'h:inputText, à l'attribut processed à <a:support>. Cela forcera l'entrée de la ligne spécifique à traiter. Par exemple (non testé):

    <h:inputText value="#{detOrdComp.ordCostoUnitario}" 
    id="txtCostoUnitario" required="true"> 
    <a:support event="onblur" reRender="columnaMonto" 
        immediate="true" bypassUpdates="false" ajaxSingle="true" processed="txtCostoUnitario" /> 
    <a:support event="onviewactivated" reRender="columnaMonto" immediate="true" 
        bypassUpdates="false" ajaxSingle="true" processed="txtCostoUnitario"/> 
    </h:inputText> 
    
  • Retirez le ajaxSingle et la place entourent la <h:inputText> dans un a4j:region (analogue à ajaxSingle avec traitement, ici toutes les entrées de la région la plus proche/enfermant sont traités):

    <a4j:region> 
        <h:inputText value="#{detOrdComp.ordCostoUnitario}" id="txtCostoUnitario" 
          required="true"> 
         <a:support event="onblur" reRender="columnaMonto" 
          immediate="true" bypassUpdates="false" /> 
         <a:support event="onviewactivated" reRender="columnaMonto" 
          immediate="true" bypassUpdates="false" /> 
        </h:inputText> 
    </a4j:region> 
    
  • Supprimez le ajaxSingle. Cela entraînera le traitement de tous les éléments de votre formulaire. Prendra plus de temps.

    Entrez le code ici

+0

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