Шов: Проблема с обновлением данных в h: inputText в строке rich: dataTable - PullRequest
2 голосов
/ 05 ноября 2010

Я пытаюсь создать редактируемую таблицу для ввода значений деталей заказа на покупку. У меня есть привязка rich: datatable к списку, и я динамически добавляю строки в таблицу, добавляя элементы в список. У сущности есть два поля, которые необходимо ввести вручную, поэтому я использую h: inputTexts, чтобы сделать это, но значения, введенные в эти поля, не сохраняются в объектах в списке. Я пытался сделать это с помощью rich: inplaceInput (следуя точным инструкциям на livedemo для Exadel Richfaces), но безрезультатно. Это мой код:

    <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;
 }

Вместо s: украшает, я использовал что-то подобное раньше (из Livedemo), но это не сработало, либо

<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>

Что мне здесь не хватает? Любая помощь будет оценена. Заранее спасибо.

1 Ответ

1 голос
/ 06 ноября 2010

Я думаю, что ваша проблема в атрибуте ajaxSingle="true".Этот атрибут означает, что, даже если все входные элементы в форме отправлены, будет обработан только тот вход, который вызвал отправку.

Если это проблема, вы можете попробовать любое из следующего (Я предполагаю, что префикс a является общим префиксом a4j?):

  • Добавьте идентификатор h:inputText к атрибуту processed в <a:support>.Это заставит вводить конкретную строку для обработки.Например (не проверено):

    <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>
    
  • Удалите ajaxSingle и вместо этого окружите <h:inputText> в a4j:region (аналогично ajaxSingle с обработанным, здесь все входыв ближайшем / окружающем регионе обрабатываются):

    <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>
    
  • Удалить ajaxSingle.Это приведет к обработке всех элементов в вашей форме.Займет больше времени.

    введите код

...