2017-09-04 11 views
0

ページング時に、編集可能なフィールドとページネーションを持つデータテーブルでコントローラの変更された値が更新されません。ページネーションでデータテーブルの入力が変更された値を失う

コントローラには、ViewScopedの有効範囲があります。

テーブルのページを変更すると、入力された値はモデルに保存されず、悲しいときには現在のページの値??だけが送信されます。モデル

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

Example

XHTMLのコード

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

コードのコードはありがとう

バージョン

  • 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は、データテーブルの入力とは異なるものです... – 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> 
関連する問題