2012-05-17 52 views
9

Estoy creando una tabla de datos dinámica llena de campos de entrada. A veces, cuando el usuario inserta valores en algunas entradas, se debe actualizar una celda específica y solo esta celda. Pensé que podría ser simple, pero aún así no lo hizo funcionar. La célula Quiero actualización es "valor total", esta celda debe ser actualizado cuando el valor de los otros dos de cambio de celda:Cómo actualizar solo una celda específica en las primes de datos dataTable

cell to update

EDITED

js chrome

tengo tryied f: ajax con identificación completa y obtuvo "Component with id: lancamentoNF: popupLancamentoNF: tabelaItensNF: 0: valorTotalItem not found". Cambiado a p: ajax y no se producen errores, pero no se actualiza.

<h:panelGroup id="painelItensNF" layout="block" styleClass="hrgi-div-form aba-lancamento-nf clearfix" style="overflow:auto;"> 
    <h:panelGroup layout="block" style="width: 1700px;"> 
     <p:dataTable id="tabelaItensNF" value="#{modeloTabelaDinamicaItemNF.itens}" var="itemEmbrulhado" styleClass="tabelaDinamica" height="174" style="width: 100%;" rowIndexVar="indice"> 
      ... (some columns) 
      <p:column style="width: 5%" 
         headerText="quantidade"> 
       <hrgi:spinner id="quantidadeItem" 
           value="#{itemEmbrulhado.item.produto.detalheTributavel.quantidade}" 
           dinheiro="false" 
           fator="#{itemEmbrulhado.item.produto.detalheTributavel.unidadeFracionada?0.01:1}" 
           local="pt-BR" min="0.00" width="70"> 
        <p:ajax event="change" 
          update="lancamentoNF:popupLancamentoNF:tabelaItensNF:#{indice}:valorTotalItem" 
          listener="#{controladorPopupLancamentoNF.calcularValorTotalItem(itemEmbrulhado)}" global="false" /> 
        <f:convertNumber 
          maxFractionDigits="#{itemEmbrulhado.item.produto.detalheTributavel.unidadeFracionada?2:0}" 
          minFractionDigits="#{itemEmbrulhado.item.produto.detalheTributavel.unidadeFracionada?2:0}" 
          locale="pt-BR" 
          for="quantidadeItem"/> 
       </hrgi:spinner> 
      </p:column> 
      <p:column style="width: 5%" 
         headerText="valor unitario"> 
       <hrgi:spinner id="valorUnitarioItem" 
           value="#{itemEmbrulhado.item.produto.detalheTributavel.valorUnitario}" 
           dinheiro="true" fator="0.01" local="pt-BR" min="0.00" width="70"> 
        <p:ajax event="change" 
          update="lancamentoNF:popupLancamentoNF:tabelaItensNF:#{indice}:valorTotalItem" 
          listener="#{controladorPopupLancamentoNF.calcularValorTotalItem(itemEmbrulhado)}" global="false"/> 
        <f:convertNumber type="currency" currencyCode="BRL" currencySymbol="R$ " 
            maxFractionDigits="10" minFractionDigits="2" locale="#{cc.attrs.local}" 
            for="valorUnitarioItem"/> 
       </hrgi:spinner> 
      </p:column> 
      <p:column style="width: 3%" 
         headerText="valor total"> 
       <h:outputText id="valorTotalItem" value="#{itemEmbrulhado.item.produto.valorTotal}"> 
        <f:convertNumber type="currency" currencyCode="BRL" currencySymbol="R$ " 
            maxFractionDigits="2" minFractionDigits="2" locale="pt-BR" 
            for="valorUnitarioItem"/> 
       </h:outputText> 
      </p:column> 
      ... (more columns) 
     </p:dataTable> 
    </h:panelGroup> 
</h:panelGroup> 

Funciona cuando actualizo el panelGroup "painelItensNF" con el número de identificación completo, pero el foco se pierde y el usuario debe encontrar la entrada que estaba trabajando para continuar ...

+0

Debe reemplazar su respuesta aceptada ya que esto parece ser posible. –

Respuesta

14

Simplemente use update="valorTotalItem". Ya es relativo a la fila actual.

Por lo tanto, reemplazar

<p:ajax ... update="lancamentoNF:popupLancamentoNF:tabelaItensNF:#{indice}:valorTotalItem" /> 

por

<p:ajax ... update="valorTotalItem" /> 
+0

No funcionó ... Simplemente usando ID completo sin índice de fila funciona – brevleq

+0

Siempre me ha funcionado. ¿Qué versión JSF impl/versión y PF estás usando? – BalusC

+0

PF 2.2.1 con mis caras 2.1.6 – brevleq

0

no creo que es posible actualizar una sola celda. Su id está autogenerado, por lo que no puede actualizar este componente por id.
Puede intentar cambiar a Primefaces 3.3 (aún no se ha lanzado, pero puede comenzar a trabajar con la instantánea), e intente si puede hacer lo que desee utilizando los selectores de Primefaces: http://www.primefaces.org/showcase-labs/ui/selectors.jsf
tendrá más cambios con eso, pero no estoy seguro si podrás hacerlo.

O bien, podría actualizar el panel y agregar algunos javascript para establecer el foco en el componente apropiado. ejecuta el javascript en el método "oncomplete" del componente p: ajax.

EDIT: Retire el índice de la actualización, por lo que se ve así: ": lancamentoNF: popupLancamentoNF: tabelaItensNF: valorTotalItem" Y, por supuesto BalusC es correcta, es posible que también acaba de utilizar "valorTotalItem"

+0

Gracias por su respuesta. He agregado una nueva imagen que muestra la identificación sigue un patrón. Este proyecto es difícil de cambiar a Primefaces 3 (ya lo he intentado). – brevleq

+0

@brevleq intenta actualizar esto: ": lancamentoNF: popupLancamentoNF: tabelaItensNF: valorTotalItem" (sin índice, y comenzando con ":"). no arrojará excepción, pero no estoy seguro de qué se actualizará. tal vez toda la columna "valorTotaItem". déjame saber lo que sucede – Damian

+0

Gracias @Damian, el enfoque de eliminar el índice funcionó! No entiendo por qué, pero funcionó ... Por favor, cambie la respuesta para que pueda marcar como resuelto :) – brevleq

Cuestiones relacionadas