Dapatkah saya memperbarui komponen JSF dari metode kacang pendukung JSF?

100

Apakah ada cara agar kacang Dukungan JSF menyebabkan pembaruan komponen pada halaman? Saya tidak ingin menggunakan komponen ajax dengan atribut update untuk memperbarui komponen di halaman. Saya perlu memicu pembaruan dari dalam metode kacang dukungan JSF. Perhatikan bahwa pembaruan pada halaman dapat terjadi setelah metode ini selesai atau sebelum penyelesaiannya. Saya menggunakan PrimeFaces, jika ada solusi yang dapat diperoleh dari penggunaan PrimeFaces.

Praktik terbaik
sumber
Dapat memicu kesalahan validasi: stackoverflow.com/a/14401741/1599699
Andrew

Jawaban:

183

Menggunakan JSF API standar, tambahkan ID klien ke PartialViewContext#getRenderIds().

FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add("foo:bar");

Menggunakan API khusus PrimeFaces, gunakan PrimeFaces.Ajax#update().

PrimeFaces.current().ajax().update("foo:bar");

Atau jika Anda belum menggunakan PrimeFaces 6.2+, gunakan RequestContext#update().

RequestContext.getCurrentInstance().update("foo:bar");

Jika Anda kebetulan menggunakan pustaka utilitas JSF OmniFaces , gunakan Ajax#update().

Ajax.update("foo:bar");

Terlepas dari caranya, perhatikan bahwa ID klien tersebut harus mewakili ID klien absolut yang tidak diawali dengan NamingContainerkarakter pemisah seperti yang Anda lakukan dari sisi tampilan.

BalusC
sumber
6
Tampaknya seolah-olah saya tidak bisa mendapatkan ini untuk bekerja selama fase Render Response (yang sayangnya di mana saya terpaksa menempatkan kode ini). Jika saya menempatkan di Aplikasi Panggilan atau fase sebelumnya, semuanya berfungsi dengan baik. Ada solusi untuk berada dalam fase Render Response?
BestPractices
8
Tidak, sudah terlambat. Pindahkan pekerjaan untuk menjalankan fase tindakan atau sebelum fase respons render. Panggil metode dengan <f:ajax listener>atau<f:event type="preRenderView" listener>
BalusC
Ada ide tentang bagaimana melakukannya dengan JSF 1.2? Saya dapat mengajukan pertanyaan baru jika jawabannya terlalu panjang / rumit.
RinaldoPJr
@RinaldoPJr: JSF 1.2 tidak memiliki konsep <f:ajax>. Ini diperkenalkan sejak JSF 2.0. Anda harus menggunakan fasilitas khusus pustaka komponen JSF 1.2.
BalusC
@DanielK: Tidak tahu. Saya tidak melakukan Trinidad. Cukup gunakan pendekatan API JSF standar jika Anda masih tidak dapat memahami cara Trinidad.
BalusC
9

Saya juga mencoba memperbarui komponen dari jsf backing bean / class

Anda perlu melakukan hal berikut setelah memanipulasi komponen UI:

FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add(componentToBeRerendered.getClientId())

Penting untuk menggunakan clientId sebagai ganti componentId (sisi server) !!

Frithjof Schaefer
sumber
1

Semuanya mungkin hanya jika ada cukup waktu untuk meneliti :)

Apa yang harus saya lakukan adalah seperti memiliki orang yang saya iterasi ke dalam sebuah ui: ulangi dan tampilkan nama dan bidang lain dalam masukan. Tetapi salah satu bidang adalah singleSelect - A dan bergantung padanya, perbarui nilai masukan lain - B. bahkan ui: ulangi tidak memiliki id yang saya masukkan dan muncul di pohon DOM

<ui:repeat id="peopleRepeat"
value="#{myBean.people}"
var="person" varStatus="status">

Dari id di html adalah seperti:

myForm:peopleRepeat:0:personType
myForm:peopleRepeat:1:personType

Dari pada tampilan saya mendapat satu metode seperti:

<p:ajax event="change"
listener="#{myBean.onPersonTypeChange(person, status.index)}"/>

Dan implementasinya ada di kacang seperti:

String componentId = "myForm:peopleRepeat" + idx + "personType";
PrimeFaces.current().ajax().update(componentId);

Jadi dengan cara ini saya memperbarui elemen dari kacang tanpa masalah. PF versi 6.2

Semoga berhasil dan selamat coding :)

panayot_kulchev_bg
sumber
Jika Anda memiliki peristiwa perubahan ajax di personType, maka meneruskan orang dan indeks ke pendengar ajax tidak berguna. Anda bisa mendapatkan id dan nilai dari acara tersebut. Tetapi solusi Anda mungkin diperlukan untuk kasus penggunaan spesifik Anda, tetapi karena tidak ada contoh lengkap (dalam contoh rasa yang dapat direproduksi minimal ), sulit untuk mengatakannya.
Kukeltje