Primefaces dataTable中的InputText不刷新

问题描述:

当表单处于可编辑模式时,需要在primefaces数据表中包含inputTexts。Primefaces dataTable中的InputText不刷新

除了使用immediate =“true”(没有表单验证)的表单清理以外,一切正常。那么primefaces数据表的行为是不可预测的。用新数据填写数据表后,它仍然保存旧值。

短的例子 - 显示h的差异:DataTable,并将号码:dataTable的 - 但它的工作方式相同,只有从例子三个表之一时: test.xhtml

<h:body> 
    <h:form id="form"> 

     <p:dataTable var="v" value="#{test.list}" id="testTable"> 
      <p:column headerText="Test value"> 
       <p:inputText value="#{v}"/> 
      </p:column> 
     </p:dataTable> 

     <h:dataTable var="v" value="#{test.list}" id="testTable1"> 
      <h:column> 
      <f:facet name="header"> 
       <h:outputText value="Test value" /> 
      </f:facet> 
       <p:inputText value="#{v}" /> 
      </h:column> 
     </h:dataTable> 

     <p:dataTable var="v" value="#{test.list}" id="testTable2"> 
      <p:column headerText="Test value"> 
       <h:outputText value="#{v}" /> 
      </p:column> 
     </p:dataTable> 

     <p:commandButton value="Clear" actionListener="#{test.clear()}" immediate="true" update=":form:testTable :form:testTable1 :form:testTable2"/> 
     <p:commandButton value="Update" actionListener="#{test.update()}" update=":form:testTable :form:testTable1 :form:testTable2"/> 
    </h:form> 
</h:body> 

和java:

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 

import javax.annotation.PostConstruct; 
import javax.faces.bean.ViewScoped; 
import javax.inject.Inject; 
import javax.inject.Named; 

@Named 
@ViewScoped 
public class Test implements Serializable { 

    private static final long serialVersionUID = 1L; 

    private List<String>   list; 



    @PostConstruct 
    private void init(){ 
     update(); 
    } 

    public List<String> getList() { 
     return list; 
    } 

    public void setList(List<String> list) { 
     this.list = list; 
    } 

    public void clear() { 
     list = new ArrayList<String>(); 
    } 

    public void update() { 
     list = new ArrayList<String>(); 
     list.add("Item 1"); 
     list.add("Item 2");  
    } 
} 

在上面的例子我有3种配置: 1.号码:dataTable中具有p:inputText的 2. H:dataTable中具有p:0的inputText3.号码:dataTable中与H:的outputText

和2个按钮:首先清除数据,第二数据应用

工作流程:

  1. 尝试更改中的p inputTexts数据:dataTable中和h :dataTable的

  2. 列表清除数据(字符串的ArrayList) - 点击“清除”按钮(想象一下,你点击取消形式,因为你不想来存储数据到数据库)

  3. 加载新的数据 - 点击“更新”按钮(想象一下,你是开扩新数据的新形式)

问: 为什么号码:dataTable中与号码:inputText的还是卖场手动更改数据,不是装载的? 有没有办法强制p:dataTable的行为像h:dataTable在这种情况下?

解决的办法是:primefaces resetInput

在我的例子将是:

<p:commandButton value="Clear" actionListener="#{test.clear()}" immediate="true" 
      update=":form:testTable :form:testTable1 :form:testTable2"> 
    <p:resetInput target=":form:testTable" /> 
</p:commandButton> 


编辑: 在某些情况下 - 如果上面是行不通的 - 试图从primefaces扩展的一个:

<pe:resetInput for=":form:testTable" /> 

您遇到的问题是提交表单时,将为绑定到此列表中的每个数据表(或<h>)提交#{test.list}值。换句话说:

  • JSF将testTable DataTable的值绑定到你的#{test.list}

  • JSF将把数据表testTable1的值绑定到#{test.list}。这些值将取代从testTable数据表绑定的值,并且数据将丢失。 #{test.list}将包含testTable1中的数据。

  • JSF将把testTable2数据表的值绑定到#{test.list}。由于这里的 值是旧值,这些值将被提交#{test.list}

解决这个问题的最好办法是使用单个<p:dataTable>(或<h>,根据您的需要),并在您的托管bean,如果你的表是在查看或编辑模式控制的属性。

JSF代码

<h:form id="form"> 
    <p:dataTable var="v" value="#{test.list}" id="testTable"> 
     <p:column headerText="Test value"> 
      <h:outputText value="#{v}" rendered="#{not test.editMode}" /> 
      <p:inputText value="#{v}" rendered="#{test.editMode}" /> 
     </p:column> 
    </p:dataTable> 

    <p:commandButton value="Clear" actionListener="#{test.clear()}" immediate="true" 
     update="testTable" /> 
    <p:commandButton value="Update" actionListener="#{test.update()}" 
     update="testTable" /> 
    <!-- adding a new button just for testing purposes --> 
    <p:commandButton value="Submit list" action="#{test.submit}" /> 
</h:form> 

Managed Bean的代码

//no need of CDI 
@ManagedBean 
@ViewScoped 
public class Test implements Serializable { 

    private List<String> list; 
    private boolean editMode = false; 

    public Test() { 

    } 

    @PostConstruct 
    private void init(){ 
     update(); 
    } 

    public List<String> getList() { 
     return list; 
    } 

    public void setList(List<String> list) { 
     this.list = list; 
    } 

    public void clear() { 
     list = new ArrayList<String>(); 
    } 

    public void update() { 
     list = new ArrayList<String>(); 
     list.add("Item 1"); 
     list.add("Item 2");  
    } 

    //method for testing purposes 
    public void submit() { 
     //in real life web apps, you should log the messages, don't use System.out 
     System.out.println("Showing actual values of list attribute."); 
     for(String s : list) { 
      System.out.println(s); 
     } 
    } 
} 
+0

感谢Luiggi,但正如你说这是不是。我发布了这三个表来显示p:dataTable和h:dataTable的行为差异。但在我的例子中只列出了其中的一个表。 p:dataTable仍然会像我描述的那样工作,因为我不喜欢,而h:dataTable会像我喜欢的那样工作。你能告诉我为什么p:dataTable从bean中清除绑定的空列表(清理后),并且在新列表生成并更新p:dataTable之后,手动更改但不是绑定列表。它会记住在bean清单清理之前手动创建的值。 – robson