2012-05-17 13 views
9

Sto creando un datatable dinamico completo di campi di input. A volte quando l'utente inserisce valori in alcuni input, deve essere aggiornata una cella specifica e solo questa cella. Ho pensato che potesse essere semplice, ma non ha funzionato. La cella che voglio aggiornamento è "valore totale", questa cella dovrebbe essere aggiornato quando il valore del cambiamento delle cellule altri due:Come aggiornare solo la cella specifica in datafaces dataTable

cell to update

CURA

js chrome

ho provato f: ajax con id completo e ottenuto "Componente con id: lancamentoNF: popupLancamentoNF: tabelaItensNF: 0: valorTotalItem non trovato". Modificato su p: ajax e nessun errore si verifica ma non si aggiorna !!

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

Funziona quando aggiorno il panelGroup "painelItensNF" con totale id, ma l'attenzione è persa e l'utente dovrebbe trovare l'ingresso stava lavorando per continuare ...

+0

Si dovrebbe sostituire la risposta accettata come questo sembra essere possibile. –

risposta

14

Basta usare update="valorTotalItem". È relativo alla riga corrente già.

Quindi, sostituire

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

da

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

Non ha funzionato ... Basta usare l'id completo senza indice di riga funziona – brevleq

+0

Ha sempre funzionato per me. Quale versione/versione di JSF e versione PF stai usando? – BalusC

+0

PF 2.2.1 con myfaces 2.1.6 – brevleq

0

Io non credo che sia possibile aggiornare una singola cella. L'ID viene generato automaticamente, quindi non è possibile aggiornare questo componente con ID.
Puoi provare a passare a primefaces 3.3 (non ancora la versione finale, ma puoi iniziare a lavorare con lo snapshot) e provare se puoi fare quello che vuoi usando i selettori di primefaces: http://www.primefaces.org/showcase-labs/ui/selectors.jsf
avrai più cambiamenti con quello, ma non sono sicuro che tu sia in grado di farlo.

Oppure, è possibile aggiornare il pannello e aggiungere alcuni javascript per impostare lo stato attivo sul componente appropriato. eseguire il javascript nel metodo "oncomplete" del componente p: ajax.

EDIT: rimuovere l'indice l'aggiornamento, in modo che appaia in questo modo: ": lancamentoNF: popupLancamentoNF: tabelaItensNF: valorTotalItem" E naturalmente BalusC è giusto, si può anche semplicemente usare "valorTotalItem"

+0

Grazie per la risposta. Ho aggiunto una nuova immagine che mostra l'ID seguire uno schema. Questo progetto è difficile da modificare in Primefaces 3 (l'ho già provato). – brevleq

+0

@brevleq prova ad aggiornare questo: ": lancamentoNF: popupLancamentoNF: tabelaItensNF: valorTotalItem" (senza indice e iniziando con ":"). non farà eccezione, ma non sono sicuro di cosa verrà aggiornato. forse l'intera colonna "valorTotaItem". fammi sapere cosa succede – Damian

+0

Grazie a @Damian, l'approccio di rimozione dell'indice ha funzionato! Non capisco perché, ma ha funzionato ... Si prega di cambiare la risposta in modo da poter contrassegnare come risolto :) – brevleq

Problemi correlati