<p:commandXxx process>
<p:ajax process>
<f:ajax execute>
process
แอตทริบิวต์ฝั่งเซิร์ฟเวอร์และสามารถส่งผลกระทบเพียงUIComponent
s การดำเนินการEditableValueHolder
(ช่องใส่) หรือActionSource
(ทุ่งคำสั่ง) process
แอตทริบิวต์บอก JSF โดยใช้รายการพื้นที่ที่คั่นของรหัสลูกค้าซึ่งส่วนประกอบว่าจะต้องดำเนินการผ่านวงจร JSF ทั้งหมดเมื่อ (บางส่วน) ส่งแบบฟอร์ม
จากนั้น JSF จะใช้ค่าคำขอ (การค้นหาพารามิเตอร์คำขอ HTTP ขึ้นอยู่กับ ID ไคลเอ็นต์ของส่วนประกอบและจากนั้นตั้งค่าเป็นค่าที่ส่งในกรณีของEditableValueHolder
ส่วนประกอบหรือจัดคิวใหม่ActionEvent
ในกรณีของActionSource
ส่วนประกอบ) ทำการแปลงตรวจสอบและอัพเดทค่ารุ่น ( EditableValueHolder
ส่วนประกอบเท่านั้น) และในที่สุดก็เรียกคิวActionEvent
( ActionSource
ส่วนประกอบเท่านั้น) JSF จะข้ามการประมวลผลของส่วนประกอบอื่น ๆ ทั้งหมดที่ไม่ได้รับการคุ้มครองโดยprocess
คุณลักษณะ นอกจากนี้ส่วนประกอบที่มีแอrendered
ททริบิวต์ประเมินfalse
ระหว่างช่วงคำขอการใช้ค่าจะถูกข้ามไปด้วยซึ่งเป็นส่วนหนึ่งของการป้องกันการร้องขอที่ดัดแปลง
โปรดทราบว่าในกรณีของActionSource
องค์ประกอบ (เช่น<p:commandButton>
) สำคัญมากที่คุณจะต้องรวมองค์ประกอบเองไว้ในprocess
แอตทริบิวต์โดยเฉพาะถ้าคุณตั้งใจจะเรียกใช้การกระทำที่เกี่ยวข้องกับส่วนประกอบ ตัวอย่างด้านล่างซึ่งมีเจตนาที่จะดำเนินการเฉพาะองค์ประกอบอินพุตบางอย่างเมื่อมีการเรียกใช้องค์ประกอบคำสั่งบางอย่างซึ่งจะไม่ทำงาน:
<p:inputText id="foo" value="#{bean.foo}" />
<p:commandButton process="foo" action="#{bean.action}" />
มันจะประมวลผล#{bean.foo}
และไม่ #{bean.action}
คุณจะต้องรวมองค์ประกอบคำสั่งด้วยเช่นกัน:
<p:inputText id="foo" value="#{bean.foo}" />
<p:commandButton process="@this foo" action="#{bean.action}" />
หรืออย่างที่คุณรู้ว่าใช้@parent
ถ้ามันเป็นเพียงส่วนประกอบที่มีพาเรนต์ร่วม:
<p:panel><!-- Type doesn't matter, as long as it's a common parent. -->
<p:inputText id="foo" value="#{bean.foo}" />
<p:commandButton process="@parent" action="#{bean.action}" />
</p:panel>
หรือหากทั้งคู่เป็นเพียงส่วนประกอบของUIForm
ส่วนประกอบหลักคุณก็สามารถใช้@form
:
<h:form>
<p:inputText id="foo" value="#{bean.foo}" />
<p:commandButton process="@form" action="#{bean.action}" />
</h:form>
บางครั้งสิ่งนี้อาจไม่พึงประสงค์หากแบบฟอร์มมีส่วนประกอบอินพุตที่คุณต้องการข้ามไปในการประมวลผลมากกว่าบ่อยครั้งในกรณีที่คุณต้องการอัปเดตองค์ประกอบอินพุตอื่นหรือส่วน UI บางส่วนตามองค์ประกอบอินพุตปัจจุบันใน วิธีการฟัง ajax คุณไม่ต้องการให้ข้อผิดพลาดในการตรวจสอบความถูกต้องของส่วนประกอบอินพุตอื่น ๆ ป้องกันไม่ให้เมธอด ajax listener ทำงาน
@all
จากนั้นก็มี สิ่งนี้ไม่มีผลพิเศษในprocess
แอตทริบิวต์ แต่เฉพาะในupdate
แอตทริบิวต์ ทำงานตรงเช่นเดียวกับprocess="@all"
process="@form"
HTML ไม่สนับสนุนการส่งหลายรูปแบบพร้อมกัน
มีโดยวิธีการนี้ยังมี@none
ซึ่งอาจจะเป็นประโยชน์ในกรณีที่คุณอย่างไม่จำเป็นต้องที่จะดำเนินการอะไร แต่เพียงต้องการปรับปรุงชิ้นส่วนบางอย่างผ่านupdate
โดยเฉพาะอย่างยิ่งในส่วนผู้ที่มีเนื้อหาไม่ได้ขึ้นอยู่กับค่าส่งหรือฟังการดำเนินการ
ควรสังเกตว่าprocess
แอตทริบิวต์นั้นไม่มีผลกับส่วนของคำขอ HTTP (จำนวนพารามิเตอร์คำขอ) ความหมายพฤติกรรม HTML เริ่มต้นของการส่ง "ทุกอย่าง" ที่มีอยู่ภายในการเป็นตัวแทน HTML ของ<h:form>
จะไม่ได้รับผลกระทบ ในกรณีที่คุณมีรูปแบบที่มีขนาดใหญ่และต้องการที่จะลดน้ำหนักบรรทุกร้องขอ HTTP เพียงเหล่านี้จำเป็นอย่างยิ่งในการประมวลผลคือเหล่านี้เท่านั้นปกคลุมด้วยprocess
แอตทริบิวต์แล้วคุณสามารถตั้งค่าpartialSubmit
แอตทริบิวต์ในส่วนประกอบ PrimeFaces อาแจ็กซ์ในขณะที่หรือ<p:commandXxx ... partialSubmit="true">
<p:ajax ... partialSubmit="true">
คุณสามารถกำหนดค่านี้ 'ทั่วโลก' โดยแก้ไขweb.xml
และเพิ่ม
<context-param>
<param-name>primefaces.SUBMIT</param-name>
<param-value>partial</param-value>
</context-param>
หรือคุณสามารถใช้<o:form>
OmniFaces 3.0+ ซึ่งเป็นค่าเริ่มต้นของพฤติกรรมนี้
JSF เทียบเท่ามาตรฐานเพื่อ PrimeFaces เฉพาะprocess
คือจากexecute
<f:ajax execute>
มันทำงานเหมือนกันยกเว้นว่าจะไม่รองรับสตริงที่คั่นด้วยเครื่องหมายจุลภาคในขณะที่ PrimeFaces ทำอยู่ (แม้ว่าโดยส่วนตัวแล้วฉันแนะนำให้ติดกับแบบแผนที่คั่นด้วยช่องว่าง) หรือ@parent
คำสำคัญ นอกจากนี้ก็อาจจะเป็นประโยชน์ที่จะรู้ว่า<p:commandXxx process>
ค่าเริ่มต้น@form
ในขณะที่<p:ajax process>
และค่าเริ่มต้น<f:ajax execute>
@this
ในที่สุดมันก็มีประโยชน์ที่จะรู้ว่าprocess
สนับสนุนสิ่งที่เรียกว่า "ตัวเลือก PrimeFaces" ดูเพิ่มเติมPrimeFaces Selectors เช่นเดียวกับใน update = "@ (. myClass)" ทำงานอย่างไร?
<p:commandXxx update>
<p:ajax update>
<f:ajax render>
update
แอตทริบิวต์ด้านลูกค้าและสามารถส่งผลกระทบต่อการแสดง HTML ของทุกUIComponent
s update
แอตทริบิวต์บอก JavaScript (หนึ่งรับผิดชอบในการจัดการกับอาแจ็กซ์คำขอ / ตอบสนอง) โดยใช้รายการพื้นที่ที่คั่นของรหัสลูกค้าซึ่งส่วนในต้นไม้จำเป็น HTML DOM ได้รับการปรับปรุงเป็นตอบสนองต่อการส่งแบบฟอร์ม
จากนั้น JSF จะจัดเตรียมการตอบสนอง ajax ที่ถูกต้องสำหรับสิ่งนั้นซึ่งมีเฉพาะส่วนที่ร้องขอเพื่ออัปเดต JSF จะข้ามส่วนประกอบอื่น ๆ ทั้งหมดที่ไม่ได้รับการคุ้มครองโดยupdate
คุณลักษณะในการตอบสนอง ajax โดยที่นี่จะรักษาอัตราการตอบสนองที่เล็ก นอกจากนี้ส่วนประกอบที่มีแอrendered
ททริบิวต์ประเมินfalse
ระหว่างการตอบสนองการแสดงผลจะถูกข้ามไป โปรดสังเกตว่าแม้ว่ามันจะกลับมาtrue
, JavaScript ไม่สามารถอัปเดตในต้นไม้ HTML DOM false
ถ้ามันเป็นครั้งแรก คุณต้องปิดมันหรืออัปเดตพาเรนต์แทน ดูเพิ่มเติมปรับปรุงอาแจ็กซ์ / ทำให้ไม่ได้ทำงานในส่วนที่มีการแสดงผลแอตทริบิวต์
โดยปกติแล้วคุณต้องการอัปเดตเพียงส่วนประกอบซึ่งจริงๆจะต้องมีการ "ฟื้นฟู" ในฝั่งไคลเอ็นต์บน (บางส่วน) ส่งแบบฟอร์ม ตัวอย่างด้านล่างอัปเดตฟอร์มหลักทั้งหมดผ่าน@form
:
<h:form>
<p:inputText id="foo" value="#{bean.foo}" required="true" />
<p:message id="foo_m" for="foo" />
<p:inputText id="bar" value="#{bean.bar}" required="true" />
<p:message id="bar_m" for="bar" />
<p:commandButton action="#{bean.action}" update="@form" />
</h:form>
(โปรดทราบว่าprocess
แอตทริบิวต์นั้นถูกข้ามไปเป็นค่าเริ่มต้น@form
แล้ว)
ในขณะที่อาจทำงานได้ดีการอัปเดตคอมโพเนนต์อินพุตและคำสั่งอยู่ในตัวอย่างนี้โดยไม่จำเป็น ถ้าคุณไม่เปลี่ยนแปลงค่ารุ่นfoo
และวิธีการbar
ภายในaction
(ซึ่งจะไม่ใช้งานง่ายในมุมมองของ UX) จะไม่มีการอัพเดทเลย ส่วนประกอบข้อความเป็นสิ่งเดียวที่จำเป็นต้องได้รับการอัพเดตจริงๆ
<h:form>
<p:inputText id="foo" value="#{bean.foo}" required="true" />
<p:message id="foo_m" for="foo" />
<p:inputText id="bar" value="#{bean.bar}" required="true" />
<p:message id="bar_m" for="bar" />
<p:commandButton action="#{bean.action}" update="foo_m bar_m" />
</h:form>
อย่างไรก็ตามนั่นก็น่าเบื่อเมื่อคุณมีหลายคน นั่นเป็นหนึ่งในเหตุผลที่ PrimeFaces Selectors มีอยู่ คอมโพเนนต์ข้อความเหล่านั้นมีในสไตล์ HTML ทั่วไปที่สร้างขึ้นui-message
ดังนั้นควรทำสิ่งต่อไปนี้:
<h:form>
<p:inputText id="foo" value="#{bean.foo}" required="true" />
<p:message id="foo_m" for="foo" />
<p:inputText id="bar" value="#{bean.bar}" required="true" />
<p:message id="bar_m" for="bar" />
<p:commandButton action="#{bean.action}" update="@(.ui-message)" />
</h:form>
(โปรดทราบว่าคุณควรเก็บ ID ไว้ในส่วนประกอบข้อความมิฉะนั้น@(...)
จะไม่ทำงาน! อีกครั้งโปรดดูPrimeFaces Selectors เช่นเดียวกับใน update = "@ (. myClass)" ทำงานอย่างไรเพื่อดูรายละเอียด)
การ@parent
อัปเดตเฉพาะองค์ประกอบหลักซึ่งจะครอบคลุมองค์ประกอบปัจจุบันและพี่น้องทั้งหมดและลูก ๆ ของพวกเขา สิ่งนี้มีประโยชน์มากขึ้นถ้าคุณแยกแบบฟอร์มในกลุ่มที่มีสติด้วยความรับผิดชอบของแต่ละคน การ@this
ปรับปรุงเห็นได้ชัดว่าเป็นเพียงองค์ประกอบปัจจุบัน โดยปกติสิ่งนี้จำเป็นเฉพาะเมื่อคุณต้องการเปลี่ยนหนึ่งในแอตทริบิวต์ HTML ของส่วนประกอบในวิธีการดำเนินการ เช่น
<p:commandButton action="#{bean.action}" update="@this"
oncomplete="doSomething('#{bean.value}')" />
ลองนึกภาพว่าความoncomplete
ต้องการที่จะทำงานกับสิ่งvalue
ที่มีการเปลี่ยนแปลงaction
นั้นโครงสร้างนี้จะไม่ทำงานหากองค์ประกอบไม่ได้รับการปรับปรุงด้วยเหตุผลง่ายๆที่oncomplete
เป็นส่วนหนึ่งของการสร้าง HTML output (และการแสดงออกของ EL ทั้งหมดในนั้นมีการประเมิน ระหว่างการตอบกลับการแสดงผล)
@all
ปรับปรุงเอกสารทั้งหมดซึ่งควรจะใช้ด้วยความระมัดระวัง ปกติคุณต้องการใช้ร้องขอ GET จริงสำหรับนี้แทนโดยทั้งการเชื่อมโยงธรรมดา ( <a>
หรือ<h:link>
) หรือการเปลี่ยนเส้นทางหลังจากที่โพสต์โดยหรือ?faces-redirect=true
ExternalContext#redirect()
ในลักษณะพิเศษนั้นprocess="@form" update="@all"
มีผลเช่นเดียวกับการส่งไม่ใช่ non-ajax (ไม่ใช่บางส่วน) ในอาชีพ JSF ทั้งหมดของฉันกรณีใช้อย่างสมเหตุสมผลเพียงอย่างเดียวที่ฉันพบ@all
คือแสดงหน้าข้อผิดพลาดอย่างครบถ้วนในกรณีที่มีข้อยกเว้นเกิดขึ้นระหว่างคำขอ ajax ดูเพิ่มเติมวิธีที่ถูกต้องในการจัดการกับข้อยกเว้น JSF 2.0 สำหรับคอมโพเนนต์ AJAXified คืออะไร
JSF เทียบเท่ามาตรฐานเพื่อ PrimeFaces เฉพาะupdate
คือจากrender
<f:ajax render>
มันทำงานเหมือนกันยกเว้นว่าจะไม่รองรับสตริงที่คั่นด้วยเครื่องหมายจุลภาคในขณะที่ PrimeFaces ทำอยู่ (แม้ว่าโดยส่วนตัวแล้วฉันแนะนำให้ติดกับแบบแผนที่คั่นด้วยช่องว่าง) หรือ@parent
คำสำคัญ ทั้งสองupdate
และrender
ค่าเริ่มต้นเป็น@none
(ซึ่งก็คือ "ไม่มีอะไร")
ดูสิ่งนี้ด้วย: