2016-05-29 5 views
0

Ich versuche, einen Wert von einem Eingabetext in einer Datatable-Spalte eingegeben und aktualisieren Sie einen Ausgabetext aus anderen Spalte mit der Multiplikation dieser Eingabetextwert und andere Eingabetextwert. Mein Problem ist, dass ich den eingegebenen Wert nicht erhalten kann, wenn Ajax aufgerufen wird, da ich den vorherigen Wert aus dem Feld erhalte, das den Wert (gasto.valor) empfängt, nicht den aktuellen Wert, der eingegeben wird. Dies ist mein Code:Kann nicht Eingabetextwert auf AJAX, nachdem sie ändern

XHTML

<p:dataTable binding="#{cadastroContasBean.dataTable}" var="gasto" 
      value="#{cadastroContasBean.listaGasto}" scrollable="true" 
      scrollHeight="150" editable="true" editMode="cell" id="Tabela" 
      widgetVar="wTabela"> 
    <p:column headerText="Nome"> 
     <p:cellEditor> 
      <f:facet name="output"> 
       <h:outputText value="#{gasto.nome}" /> 
      </f:facet> 
      <f:facet name="input"> 
       <p:inputText value="#{gasto.nome}" style="width:96%" /> 
      </f:facet> 
     </p:cellEditor> 
    </p:column> 
    <p:column headerText="Quantidade"> 
     <p:cellEditor> 
      <f:facet name="output"> 
       <h:outputText value="#{gasto.quantidade}" /> 
      </f:facet> 
      <f:facet name="input"> 
       <p:inputText id="inputQtd" value="#{gasto.quantidade}" 
          style="width:96%" onkeydown="MascaraNumero()" 
          onkeyup="MascaraNumero()"> 
        <p:ajax event="blur" render="outputVT" listener="#{cadastroContasBean.atualizaVT}" execute="inputQtd" process="@this" immediate="true"/> 
       </p:inputText> 
      </f:facet> 
     </p:cellEditor> 
    </p:column> 
    <p:column headerText="Valor"> 
     <p:cellEditor> 
      <f:facet name="output"> 
       <h:outputText value="#{gasto.valor}"> 
        <f:convertNumber currencySymbol="R$" type="currency" /> 

       </h:outputText> 
      </f:facet> 
      <f:facet name="input"> 
       <p:inputText id="inputValor" value="#{gasto.valor}" 
          style="width:96%" onkeyup="mascara(this, valor)" 
          onkeydown="mascara(this, valor)"> 
        <f:convertNumber pattern="#,##0.00"></f:convertNumber> 
        <f:validator validatorId="MoedaValidator" /> 
        <p:ajax event="blur" render="outputVT" listener="#{cadastroContasBean.atualizaVT}" execute="inputValor" process="@this" immediate="true" > 
        </p:ajax> 
       </p:inputText> 
      </f:facet> 
     </p:cellEditor> 
    </p:column> 
    <p:column headerText="Valor Total" id="vt"> 
     <h:outputText id="outputVT" value="#{gasto.valorTotal}"> 
      <f:convertNumber currencySymbol="R$" type="currency" /> 
     </h:outputText> 
    </p:column> 
</p:dataTable> 

MB

public void atualizaVT(AjaxBehaviorEvent event) { 

    Gastos gastoDataTableAtual = ((Gastos)dataTable.getRowData()); 

    if(!event.getComponent().getId().equals("inputQtd")){ 
     BigDecimal valorAtual = (BigDecimal)((UIOutput)event.getSource()).getValue(); 
     gastoDataTableAtual.setValorTotal(valorAtual.multiply(new BigDecimal(((Gastos)dataTable.getRowData()).getQuantidade()))); 
     Iterator<Gastos> gastosAsIterator = listaGasto.iterator(); 
     while (gastosAsIterator.hasNext()){ 
      Gastos it = gastosAsIterator.next(); 
      int id = 0; 
      if(it.getId() == gastoDataTableAtual.getId()){ 
       //listaGasto.get(id).setValor(gastoDataTableAtual.getValor()); 
       listaGasto.get(id).setValorTotal(gastoDataTableAtual.getValorTotal()); 
       ((Gastos)dataTable.getRowData()).setValorTotal(gastoDataTableAtual.getValorTotal()); 
       break; 
      } 
      id++; 
     } 
    }else{ 
     Integer valorAtual = (Integer)((UIOutput)event.getSource()).getValue(); 
     gastoDataTableAtual.setValorTotal(((Gastos)dataTable.getRowData()).getValor().multiply(new BigDecimal(valorAtual))); 
     Iterator<Gastos> gastosAsIterator = listaGasto.iterator(); 
     int id = 0; 
     while (gastosAsIterator.hasNext()){ 
      Gastos it = gastosAsIterator.next(); 
      if(it.getId() == gastoDataTableAtual.getId()){ 
       //listaGasto.get(id).setQuantidade(gastoDataTableAtual.getQuantidade()); 
       listaGasto.get(id).setValorTotal(gastoDataTableAtual.getValorTotal()); 
       ((Gastos)dataTable.getRowData()).setValorTotal(gastoDataTableAtual.getValorTotal()); 
       break; 
      } 
      id++; 
     } 

ich understant dass Ajax-Ereignis "Unschärfe" vor "gasto.valor" genannt wird, geändert wird, aber wenn ich ändern Das Ajax-Ereignis zum "Ändern" der Methode "attualizaVT" wird nicht aufgerufen. Wie kann ich diesen Wert erhalten?

Antwort

0

Das Ereignis "change" ist kein AjaxBehaviorEvent. Versuchen atualizaVT ohne Argument Auf diese Weise zu implementieren:

public void atualizaVT() {

Diese funktionieren sollte.

+0

Danke für die Antwort, aber es hat nicht funktioniert. Wenn ich den Eingabetext bearbeite, wird nur der Validator aufgerufen. Jedenfalls muss ich den Inhalt des Eingabetexts bekommen und ohne Argumente weiß ich nicht, wie ich es mache. –

+0

Wir verwenden Auswahlparameter in der Datentabelle select = "# {actionBean.selectedData}" Wenn Sie eine Zeile auswählen und eine AJAX-Anforderung senden, wird die ausgewählteDatenmenge auf diese Weise mit dem aktuellen Wert gefüllt. – temaleva

+0

Es hat funktioniert, aber ich habe es anders gemacht: Ich habe einen Eingangstext mit getters und Setter in der managebean-Klasse erstellt und mit dem Eingabetext in der XHTML-Ansicht verknüpft. Dann habe ich den Wert mit "inputtext.getValue()" in der "atualizaVT() Methode von event =" change "auf Ajax abgerufen. Danke für die Hilfe! - –

Verwandte Themen