ฉันต้องมี inputTexts อยู่ใน primefaces datatable เมื่อแบบฟอร์มอยู่ในโหมดแก้ไขได้
ทุกอย่างทำงานได้อย่างถูกต้อง ยกเว้นการล้างแบบฟอร์มด้วย Instant="true" (ไม่มีการตรวจสอบความถูกต้องของแบบฟอร์ม) จากนั้น Primefaces DataTable จะทำงานคาดเดาไม่ได้ หลังจากกรอก DataTable ด้วยข้อมูลใหม่แล้ว มันยังคงเก็บค่าเก่าไว้
ตัวอย่างสั้นๆ - เพื่อแสดงความแตกต่างระหว่าง h:dataTable และ p: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>
และจาวา:
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. p:dataTable ด้วย p:inputText 2. h:dataTable ด้วย p:inputText 3. p:dataTable ด้วย h:outputText
และ 2 ปุ่ม: ขั้นแรกล้างข้อมูล ขั้นที่สองใช้ข้อมูล
ขั้นตอนการทำงาน:
ลองเปลี่ยนข้อมูลใน inputTexts ใน p:dataTable และ h:dataTable
ล้างข้อมูลของรายการ (arrayList ของสตริง) - คลิกปุ่ม "ล้าง" (ลองนึกภาพว่าคุณคลิกยกเลิกในแบบฟอร์มเนื่องจากคุณไม่ต้องการเก็บข้อมูลลงในฐานข้อมูล)
โหลดข้อมูลใหม่ - คลิกปุ่ม "อัปเดต" (ลองจินตนาการว่าคุณกำลังเปิดแบบฟอร์มใหม่ด้วยข้อมูลใหม่)
คำถาม: เพราะเหตุใด p:dataTable พร้อมด้วย p:inputText ยังคงจัดเก็บข้อมูลที่เปลี่ยนแปลงด้วยตนเอง ไม่ใช่ข้อมูลที่โหลดไว้ มีวิธีใดบ้างที่จะบังคับให้ p:dataTable ทำงานเหมือน h:dataTable ในกรณีนี้?