InputText di dalam Primefaces dataTable tidak disegarkan

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:

  1. Cobalah untuk mengubah data di inputTexts di p:dataTable dan h:dataTable

  2. Hapus data daftar (arrayList of string) - klik tombol "hapus" (bayangkan Anda mengklik batal pada formulir karena Anda tidak ingin menyimpan data ke database)

  3. 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?


person robson    schedule 15.12.2012    source sumber


Jawaban (2)


Solusinya adalah: primefaces resetInput

Dalam contoh saya, itu akan menjadi:

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


EDIT: Dalam beberapa kasus - jika cara di atas tidak berhasil - coba yang dari ekstensi primefaces:

<pe:resetInput for=":form:testTable" />
person robson    schedule 18.12.2012

Masalah yang Anda alami adalah saat mengirimkan formulir, nilai #{test.list} dikirimkan untuk setiap tabel data (<p> atau <h>) yang diikat ke daftar ini di formulir. Dengan kata lain:

  • JSF akan mengikat nilai testTable datatable ke #{test.list} Anda.

  • JSF akan mengikat nilai testTable1 datatable ke #{test.list} Anda. Nilai-nilai ini akan menggantikan nilai-nilai yang diikat dari testTable datatable, dan data di sana akan hilang. #{test.list} akan berisi data di testTable1.

  • JSF akan mengikat nilai tabel data testTable2 ke #{test.list} Anda. Karena nilai di sini adalah nilai lama, maka nilai inilah yang akan dikirimkan untuk #{test.list}.

Cara terbaik untuk mengatasi masalah ini adalah dengan menggunakan satu <p:dataTable> (atau <h>, tergantung kebutuhan Anda) dan atribut dalam kacang terkelola yang mengontrol apakah tabel Anda dalam mode tampilan atau edit.

kode 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>

Kode Kacang Terkelola

//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);
        }
    }
}
person Luiggi Mendoza    schedule 15.12.2012
comment
Terima kasih Luiggi, tapi tidak seperti yang Anda katakan. Saya memposting tiga tabel ini untuk menunjukkan perbedaan perilaku p:dataTable dan h:dataTable. Tapi masukkan ke dalam contoh saya hanya satu dari tabel ini. p:dataTable akan tetap berperilaku seperti yang saya jelaskan dan tidak saya sukai, dan h:dataTable akan berperilaku sesuai keinginan saya. Bisakah Anda memberi tahu saya mengapa p:dataTable mengambil daftar kosong yang diikat dari kacang (setelah dibersihkan) dan kemudian mengambil perubahan dari tangan tetapi tidak dari daftar yang diikat setelah daftar baru dibuat dan p:dataTable diperbarui? Ia mengingat nilai-nilai yang dibuat dengan tangan sebelum pembersihan daftar di kacang. - person robson; 17.12.2012