2012-12-15 34 views
0

當表單處於可編輯模式時,需要在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在這種情況下?

回答

5

解決的辦法是: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" /> 
1

您遇到的問題是提交表單時,將爲綁定到此列表中的每個數據表(或<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