带有分页的数据表中的输入会丢失修改后的值

时间:2017-09-04 10:14:34

标签: jsf primefaces

具有可编辑字段和分页的数据表在分页时不会更新控制器中的修改值。

控制器具有Omnifaces的ViewScoped范围。

当我更改表格的页面时,输入的值不会保存在模型中,并且在执行sumbit时只会发送当前页面的值。

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

模型代码

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
  • Mojarra:2.2.14
  • Omnifaces:2.6.4
  • 焊接:2.4.4.Final

1 个答案:

答案 0 :(得分: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>