จะบังคับเฟสการสร้างในหน้า JSF 1.2 โดยใช้ JSTL ได้อย่างไร

ฉันกำลังใช้แท็ก JSTL ในแอปพลิเคชัน JSF ของฉัน ด้วยการดำเนินการบางอย่าง ฉันจำเป็นต้องสร้างแผนผังส่วนประกอบขึ้นมาใหม่ราวกับว่าเป็นงานสร้างครั้งแรก อาการปัจจุบันของฉันไม่ถูกต้องเกี่ยวกับการเชื่อมโยงส่วนประกอบ รหัสที่ซ้ำกัน และปัญหาอื่นๆ เกี่ยวกับส่วนประกอบเก่า นี่คือการใช้แท็ก c:foreach (ไม่สามารถใช้แท็กซ้ำ ดูลิงก์ตัวอย่าง) ซึ่งใช้ในขั้นตอนการสร้าง

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

สำหรับตัวอย่างโค้ดที่ฉันใช้ โปรดดูหน้านี้บนแท็บไดนามิกใน Richfaces http://in.relation.to/Bloggers/UsingDynamicallyCreatedRichFacesTabPanelForSearchResults

หมายเหตุ: การใช้ ui:repeat หรือ a4j:repeat ไม่สามารถทำได้ ดูหน้าตัวอย่างเพื่อดูรายละเอียด

หมายเหตุอื่นๆ: App bean มีการกำหนดขอบเขตเซสชัน และข้อมูลในนั้นจำเป็นต้องเป็น เพียงไม่ใช่สถานะแผนผังส่วนประกอบ

อัปเดต คำถามนี้เกี่ยวข้องกับปัญหาที่เกิดขึ้นใน บทความนี้ และความคิดเห็นแรก ฉันไม่รู้วิธีแก้ปัญหาจริงในความคิดเห็นแรกและคำตอบที่ได้รับการยอมรับก็พาฉันไป


person Adam    schedule 09.06.2011    source แหล่งที่มา


คำตอบ (1)


ฉันไม่คิดว่าส่วนประกอบเก่าเป็นปัญหา รหัสที่ซ้ำกันโดยเฉพาะเป็นผลข้างเคียงของการใช้แท็ก <c:forEach> เนื่องจาก <c:forEach> จะเพิ่มคอมโพเนนต์ย่อยลงในแผนผังคอมโพเนนต์หลายครั้ง และในแต่ละครั้งจะพยายามใช้ ID เดียวกัน (ไม่เหมือนกับ <ui:repeat>) ซึ่งส่งผลให้มี ID ซ้ำกันอย่างเห็นได้ชัด (คุณจะสังเกตได้จากตัวอย่างที่คุณเชื่อมโยงไป โดยไม่ได้ระบุ ID ใด ๆ ภายในแท็ก <c:forEach>)

ฉันไม่แน่ใจว่า 'ระยะการสร้างการดู' หมายถึงอะไร หากคุณดูที่เอกสารประกอบ JSF คุณจะเห็นว่ามี ไม่มีเฟสดังกล่าว ไม่ว่าในกรณีใด เมื่อคุณใช้ <ui:repeat> ตราบใดที่การเรียก AJAX ที่คุณใช้ในการค้นหาจะแสดงผล rich:tabPanel อีกครั้ง มันก็ควรจะใช้ได้

เหตุผลที่พวกเขาอ้างถึง <ui:repeat> ไม่ทำงานคือ:

คุณไม่สามารถใช้คอมโพเนนต์การทำซ้ำ (ทั้ง ui:repeat หรือ a4j:repeat) สำหรับสิ่งนั้น เนื่องจากคอมโพเนนต์ทำงานระหว่างเวลาแสดงผลเพจ และอย่าสร้างคอมโพเนนต์ในแผนผัง JSF แต่เพียงแค่วนซ้ำอินสแตนซ์เดียวกัน

และในตัวอย่างของพวกเขา พวกเขาใช้:

...
<a4j:commandButton action="#{capitalsBean.search}" value="Search" reRender="output" id="search"/>
...
<a4j:outputPanel id="output">
    <rich:tabPanel id="tapPanel" width="700" rendered="#{not empty capitalsBean.foundCapitals}">
        <c:forEach items="#{capitalsBean.foundCapitals}" var="cap">
        ...

หากคุณระบุ reRender="output" ในการค้นหา a4j:commandButton 'เวลาแสดงเพจ' จะไม่เกิดขึ้นสำหรับ tapPanel ได้อย่างไร

โดยสรุป ใช้ <ui:repeat> โดยทั่วไปแล้ว JSTL และ JSF จะไม่ใช่เพื่อนร่วมเตียงที่ดีนัก

แก้ไข: ฉันควรทำสิ่งนี้ก่อนเนื่องจากฉันไม่มีประสบการณ์กับ rich:tabPanel แต่ปรากฏว่า <ui:repeat> ไม่สามารถใช้กับ rich:tabPanel ได้ (แต่ไม่ใช่ด้วยเหตุผลที่ระบุไว้ในตัวอย่างที่คุณลิงก์ไป ดังนั้น ความสับสนของฉัน) อย่าใช้ <c:forEach> ให้ใช้คอมโพเนนต์ที่เชื่อมโยงกับ rich:tabPanel

person Gyan aka Gary Buyn    schedule 18.06.2011
comment
ปัญหาของฉันไม่ใช่รหัสที่ซ้ำกันเนื่องจากแท็ก c:forEach ทำซ้ำรหัสฮาร์ดโค้ดเหมือนกับภายใน c:foreach ฉันใช้ f:subview ปัญหาคือเมื่อหน้าเปลี่ยนแปลงในบางครั้งแผนผังส่วนประกอบจะเก่าไป ฉันจะตรวจสอบการเชื่อมโยงส่วนประกอบเพื่อดูว่านั่นเป็นวิธีแก้ปัญหาหรือไม่ ฉันจะพยายามค้นหาวลีที่ถูกต้องสำหรับดูวลีบิลด์ - person Adam; 20.06.2011
comment
ฉันเชื่อว่าสิ่งที่ฉันหมายถึงในเฟสการสร้างมุมมองคือมุมมองใหม่หรือเส้นทางมุมมองเริ่มต้นของเฟสมุมมองการคืนค่าซึ่งจะข้ามไปยังเฟสการตอบสนองการเรนเดอร์ - person Adam; 20.06.2011
comment
พูดตามตรงฉันไม่รู้การทำงานภายในของวงจรชีวิต JSF ในระดับนั้น คุณไม่จำเป็นต้องแม้ว่า การเรียก AJAX จะเรียกใช้วงจรการใช้งาน JSF ในลักษณะเดียวกับที่ JSF postback ทั่วไปจะเรียกใช้ ข้อแตกต่างเพียงอย่างเดียวคือคุณสามารถเลือกและเลือกส่วนประกอบที่จะประมวลผลโดยระยะต่างๆ ได้โดยใช้แอตทริบิวต์ process และ reRender ฉันไม่เข้าใจว่าทำไมคุณถึงได้รับแผนผังส่วนประกอบ 'เก่า' สิ่งเดียวที่อาจเป็น 'เก่า' ในฝั่งไคลเอ็นต์คือสิ่งที่ไม่รวมอยู่ในแอตทริบิวต์ reRender - person Gyan aka Gary Buyn; 21.06.2011
comment
ฉันยังไม่เห็นว่าฉันตอบคำถามของคุณได้อย่างน่าพอใจ ... ขอบคุณที่ยอมรับเหมือนกัน ลองผูกแล้วติดต่อกลับมาหาฉัน - person Gyan aka Gary Buyn; 21.06.2011
comment
การเชื่อมโยงทำให้ฉันพบเส้นทางที่ถูกต้องไปยังโซลูชันเช่นนี้: tabPanel.getParent().getChildren().clear(); ซึ่งจะเป็นการล้างแผงแท็บออกจากโครงสร้างส่วนประกอบและจะถูกสร้างขึ้นใหม่ - person Adam; 21.06.2011