ฉันสามารถอัปเดตคอมโพเนนต์ JSF จากเมธอด JSF backing bean ได้หรือไม่


100

มีวิธีใดที่จะทำให้ JSF Backing bean มีการอัปเดตคอมโพเนนต์บนเพจได้หรือไม่? ฉันไม่ต้องการใช้คอมโพเนนต์ ajax ที่มีคุณสมบัติการอัปเดตเพื่ออัปเดตคอมโพเนนต์บนเพจ ฉันต้องการทริกเกอร์การอัปเดตจากภายในวิธีการถั่วสำรอง JSF โปรดทราบว่าการอัปเดตบนเพจอาจเกิดขึ้นได้หลังจากวิธีนี้เสร็จสิ้นหรือก่อนที่จะเสร็จสิ้น ฉันใช้ PrimeFaces หากมีวิธีแก้ปัญหาจากการใช้ PrimeFaces


สามารถทำให้เกิดข้อผิดพลาดในการตรวจสอบความถูกต้อง: stackoverflow.com/a/14401741/1599699
Andrew

คำตอบ:


183

ใช้ JSF มาตรฐาน API PartialViewContext#getRenderIds()เพิ่มรหัสลูกค้าเพื่อ

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

ใช้ PrimeFaces เฉพาะ API PrimeFaces.Ajax#update()ใช้

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

หรือถ้าคุณยังไม่ได้ใช้ PrimeFaces 6.2+ ให้ใช้RequestContext#update().

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

หากคุณใช้ไลบรารียูทิลิตี้ JSF OmniFacesให้ใช้Ajax#update().

Ajax.update("foo:bar");

ไม่ว่าจะด้วยวิธีใดโปรดทราบว่ารหัสไคลเอ็นต์เหล่านั้นควรแสดงถึงรหัสไคลเอ็นต์แบบสัมบูรณ์ซึ่งไม่ได้ขึ้นต้นด้วยNamingContainerอักขระตัวคั่นเหมือนที่คุณทำจากด้านมุมมอง


6
ดูเหมือนว่าฉันไม่สามารถทำให้สิ่งนี้ทำงานได้ในช่วงการตอบสนองการแสดงผล (ซึ่งน่าเสียดายที่ฉันถูกบังคับให้วางรหัสนี้) หากฉันวางใน Invoke Application หรือขั้นตอนก่อนหน้านี้สิ่งต่างๆก็ใช้ได้ดี วิธีแก้ปัญหาใด ๆ สำหรับการอยู่ในขั้นตอนการตอบสนองการแสดงผล
BestPractices

8
ไม่มันสายเกินไป ย้ายงานเพื่อเรียกใช้เฟสการดำเนินการหรือก่อนแสดงเฟสตอบสนอง เรียกใช้วิธีการโดย<f:ajax listener>หรือ<f:event type="preRenderView" listener>
BalusC

มีความคิดอย่างไรกับ JSF 1.2? ฉันสามารถถามคำถามใหม่ได้หากคำตอบยาว / ซับซ้อนเกินไป
RinaldoPJr

@RinaldoPJr: JSF 1.2 <f:ajax>มีแนวคิดของการไม่มี เริ่มใช้ตั้งแต่ JSF 2.0 คุณต้องใช้สิ่งอำนวยความสะดวกเฉพาะไลบรารีคอมโพเนนต์ JSF 1.2
BalusC

@ DanielK: ไม่มีความคิด ฉันไม่ทำตรินิแดด เพียงใช้วิธี JSF API มาตรฐานหากคุณยังไม่สามารถหาวิธีของตรินิแดดได้
BalusC

9

ฉันยังพยายามอัปเดตส่วนประกอบจาก jsf backing bean / class

คุณต้องทำสิ่งต่อไปนี้หลังจากจัดการกับคอมโพเนนต์ UI:

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

สิ่งสำคัญคือต้องใช้ clientId แทน componentId (ฝั่งเซิร์ฟเวอร์) !!


7

RequestContextจะเลิกจากPrimefaces 6.2 จากเวอร์ชันนี้ใช้สิ่งต่อไปนี้:

if (componentID != null && PrimeFaces.current().isAjaxRequest()) {
    PrimeFaces.current().ajax().update(componentID);
}

และในการรันจาวาสคริปต์จาก backbean ให้ใช้วิธีนี้:

PrimeFaces.current().executeScript(jsCommand);

อ้างอิง:


1

ทุกอย่างเป็นไปได้ก็ต่อเมื่อมีเวลาค้นคว้ามากพอ :)

สิ่งที่ฉันต้องทำก็เหมือนกับการมีคนที่ฉันทำซ้ำใน ui: ทำซ้ำและแสดงชื่อและช่องอื่น ๆ ในอินพุต แต่หนึ่งในฟิลด์คือ singleSelect - A และขึ้นอยู่กับค่านั้นอัปเดตอินพุตอื่น - B. แม้ ui: repeat ไม่มี id ที่ฉันใส่และปรากฏในโครงสร้าง DOM

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

กว่ารหัสใน html มีดังนี้:

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

ในมุมมองฉันมีวิธีการหนึ่งเช่น:

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

และการใช้งานอยู่ในถั่วเช่น:

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

ด้วยวิธีนี้ฉันจึงอัปเดตองค์ประกอบจาก bean โดยไม่มีปัญหา PF เวอร์ชัน 6.2.2

ขอให้โชคดีและมีความสุขในการเขียนโค้ด :)


หากคุณมีเหตุการณ์การเปลี่ยนแปลง ajax ในวันpersonTypeนั้นการส่งต่อทั้งบุคคลและดัชนีไปยังผู้ฟัง ajax นั้นไม่จำเป็น คุณสามารถรับทั้ง id และค่าจากเหตุการณ์ แต่โซลูชันของคุณอาจจำเป็นสำหรับ usecase เฉพาะของคุณ แต่เนื่องจากไม่มีตัวอย่างทั้งหมด (ในตัวอย่างที่ทำซ้ำได้น้อยที่สุด ) จึงยากที่จะบอกได้
Kukeltje
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.