具有可编辑字段和分页的数据表在分页时不会更新控制器中的修改值。
控制器具有ViewScoped Omnifaces范围。
当我更改表格的页面时,输入的值不会保存在模型中,并且在执行sumbit时,只会发送当前页面的值。
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;
}
}
谢谢
版本
发生这种情况是因为在每个页面上更改组件将转到辅助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>