2017-09-04 24 views
0

帶分隔符的可編輯字段和分頁的數據表不會在分頁時更新控制器中的修改值。帶有分頁的數據表輸入丟失修改後的值

控制器具有Omnifaces的ViewScoped範圍。

當我更改表格的頁面時,輸入的值不會保存在模型中,並且在執行sumbit時只會發送當前頁面的值。 XHTML的

Example

代碼

<h:form> 
    <p:messages autoUpdate="true"/> 
    <p:dataTable var="obj" id="tabla" 
       rows="6" paginator="true" 
       value="#{pruebaController.lista}"> 
     <p:ajax event="page" process="tabla" update="tabla"/> 
     <p:column> 
      <h:outputText value="#{obj.texto}"/> 
     </p:column> 
     <p:column> 
      <p:inputText value="#{obj.valor}"/> 
     </p:column> 
    </p:dataTable> 
    <p:commandButton value="Guardar" update="@all" process="@all" action="#{pruebaController.guardar}"/> 
</h:form> 

控制器的代碼

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 
import javax.annotation.PostConstruct; 
import javax.inject.Named; 
import org.omnifaces.cdi.ViewScoped; 

@Named("pruebaController") 
@ViewScoped 
public class PruebaController implements Serializable { 

    private List<Prueba> lista; 

    public List<Prueba> getLista() { 
     return lista; 
    } 

    public void setLista(List<Prueba> lista) { 
     this.lista = lista; 
    } 

    @PostConstruct 
    public void init() { 
     lista = new ArrayList<>(); 
     lista.add(new Prueba("uno", "")); 
     lista.add(new Prueba("dos", "")); 
     lista.add(new Prueba("tres", "")); 
     lista.add(new Prueba("cuatro", "")); 
     lista.add(new Prueba("cinco", "")); 
     lista.add(new Prueba("seis", "")); 
     lista.add(new Prueba("siete", "")); 
     lista.add(new Prueba("ocho", "")); 
     lista.add(new Prueba("nueve", "")); 
     lista.add(new Prueba("diez", "")); 
     lista.add(new Prueba("once", "")); 
     lista.add(new Prueba("doce", "")); 
     lista.add(new Prueba("trece", "")); 
     lista.add(new Prueba("catorce", "")); 
     lista.add(new Prueba("quince", "")); 
    } 

    public void guardar() { 
     for (Prueba p : lista) { 
      System.out.println(p.getTexto() + " ----- " + p.getValor()); 
     } 
    } 
}  

模型的代碼

package es.prueba; 

public class Prueba { 

    private String texto; 
    private String valor; 

    public Prueba(String texto, String valor) { 
     this.texto = texto; 
     this.valor = valor; 
    } 

    public String getTexto() { 
     return texto; 
    } 

    public void setTexto(String texto) { 
     this.texto = texto; 
    } 

    public String getValor() { 
     return valor; 
    } 

    public void setValor(String valor) { 
     this.valor = valor; 
    } 
} 

謝謝

版本

  • Primefaces:6.0.21或6.1.4
  • 鑽嘴魚科:2.2.14
  • Omnifaces:2.6.4
  • 焊縫:2.4.4.Final
+0

所以,如果你刪除'過程= 「手鼓」'工作的?並且'可編輯數據表'https://www.primefaces.org/showcase/ui/data/datatable/edit.xhtml與datable中的輸入不同... – Kukeltje

回答

0

發生這種情況是因爲在每個頁面上,組件轉到輔助bean並使用其中的值進行刷新。我遇到了完全相同的問題,只需在我想保留數據的字段後添加<p:ajax event="change" />即可輕鬆解決。這迫使該字段更新java後端的值,避免在頁面更改時丟失數據。

我的情況:

<p:column headerText="#{message['label.modeloSplitter.cor']}" rendered="#{modeloSplitterMB.entity.modelo == 'C'}"> 
      <h:selectOneMenu id="corFibras" value="#{item.cor}"> 
       <f:selectItems value="#{corMB.corSelectItems}" /> 
       <p:ajax event="change" /> 
      </h:selectOneMenu> 
</p:column> 

如何,我認爲它會在你的情況下解決:

<p:column> 
    <p:inputText value="#{obj.valor}"/> 
    <p:ajax event="change" /> 
</p:column>