Saya perlu memiliki inputTexts di dalam primefaces yang dapat didata saat formulir dalam mode yang dapat diedit.
Semuanya berfungsi dengan baik kecuali pembersihan formulir dengan direct="true" (tanpa validasi formulir). Kemudian tabel data primeface berperilaku tidak dapat diprediksi. Setelah mengisi datatable dengan data baru - masih menyimpan nilai lama.
Contoh singkat - untuk menunjukkan perbedaan antara h:dataTable dan p:dataTable - tetapi cara kerjanya sama jika hanya ada satu dari tiga tabel dari contoh: 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>
Dan Jawa:
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");
}
}
Pada contoh di atas saya memiliki 3 konfigurasi: 1. p:dataTable dengan p:inputText 2. h:dataTable dengan p:inputText 3. p:dataTable dengan h:outputText
Dan 2 tombol: pertama menghapus data, kedua menerapkan data
Alur kerja:
Cobalah untuk mengubah data di inputTexts di p:dataTable dan h:dataTable
Hapus data daftar (arrayList of string) - klik tombol "hapus" (bayangkan Anda mengklik batal pada formulir karena Anda tidak ingin menyimpan data ke database)
Muat data baru - klik tombol "perbarui" (bayangkan Anda membuka formulir baru dengan data baru)
Pertanyaan: Mengapa p:dataTable dengan p:inputText masih menyimpan data yang diubah secara manual, bukan data yang dimuat? Apakah ada cara untuk memaksa p:dataTable berperilaku seperti h:dataTable dalam kasus ini?