Pengeditan sel Primefaces pergi dalam mode edit ketika validasi gagal
Saya menggunakan p:dataTable
dengan pengeditan sel dan validator p:selectOneMenu
dengan editable = true. Saya ingin status edit sel tetap dalam mode edit (tangkapan layar kedua) jika nilai p: selectOneMenu yang dipilih atau nilai yang diketik tidak valid dan menampilkan kotak merah di sekitar input seperti yang saya bisa jika saya menggunakan formulir biasa (tangkapan layar ketiga). Ketika validasi gagal, geraman dan pesan ditampilkan tetapi kotak merah di sekitar tarik-turun tidak bertahan dan saya khawatir mungkin tidak diperhatikan oleh pengguna (tangkapan layar pertama). Saya tidak tahu bagaimana melakukan pembaruan ajax untuk menampilkan kotak merah, tetapi menjaga sel dalam mode edit sehingga dropdown dan kotak merah masih terlihat.
<p:dataTable id="table" value="#{bean.data}" var="lineItem" editable="true" editMode="cell">
<p:column headerText="* Account">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{lineItem.account}" />
</f:facet>
<f:facet name="input">
<p:selectOneMenu id="so" value="#{lineItem.account}" editable="true" dynamic="true" converter="omnifaces.SelectItemsConverter" title="Type an account or select a stored favorite" validator="com.gdeb.rozycki.app.acountValidator" >
<f:selectItem noSelectionOption="true" itemLabel="---Favorites" itemValue="null" />
<f:selectItems value="#{bean.favorites}" var="fav" itemLabel="#{fav.acctNum}" itemValue="#{fav}" />
<p:ajax disabled="#{facesContext.validationFailed}" update="table growl messages" listener="#{bean.updateAccountInline(lineItem)}" />
</p:selectOneMenu>
</f:facet>
</p:cellEditor>
</p:column>
Tangkapan layar ini saya mencoba mengubah akun ke favorit tersimpan yang disimpan dengan spasi dan kami tidak menginginkan spasi lagi. (Ya, saya sekarang memiliki validasi untuk tidak memberikan spasi ketika pengguna menyimpan nomor akun favorit mereka, tetapi ada validasi lain yang akan kami terapkan) Ketika validasi gagal, hanya header dan pesan growl yang ditampilkan. Garis merah tidak terlihat sampai mereka mengklik dropdown lagi seperti yang ditunjukkan di screenshot kedua.



Jawaban
The ajax
panggilan memiliki id DataTable table
di nya update
atribut. Saya menghapus ClientID itu dan menghapusdisabled="#{facesContext.validationFailed}"
Saya rasa cellEdit
fungsinya secara otomatis memperbarui komponen ClientId yang mengimplementasikan cellEdit. Jadi tidak perlu juga menentukan secara eksplisit di tag ajax saya.
Dan saya juga menebak bahwa tag ajax selalu menjalankan pembaruan tetapi pendengar hanya berhasil.
Saya mungkin tidak sepenuhnya mengerti mengapa tetapi inilah yang berhasil untuk saya:
<p:ajax update="growl messages" listener="#{bean.updateAccountInline(lineItem)}" />