เหตุการณ์ OnSave ของฟอร์ม (การอ้างอิง Client API) ในแอปแบบจําลองข้อมูล

เหตุการณ์บนฟอร์ม OnSave ในแอปแบบจําลองช่วยให้คุณเรียกใช้ตรรกะ ตรวจสอบข้อมูล หรือยกเลิกการบันทึกก่อนที่จะบันทึกระเบียน เหตุการณ์ OnSave จะเกิดขึ้นเมื่อ:

  • ผู้ใช้เลือกปุ่ม บันทึก หรือ รีเฟรช ในแถบคําสั่งแม้ว่าจะไม่มีการเปลี่ยนแปลงข้อมูลเพื่อบันทึกก็ตาม
  • โค้ดดําเนินการ formContext.data.entity.save method แม้ว่าจะไม่มีข้อมูลที่เปลี่ยนแปลงเพื่อบันทึกก็ตาม
  • ผู้ใช้จะนําทางออกจากฟอร์ม และมีข้อมูลที่ยังไม่ได้บันทึกในแบบฟอร์ม
  • เปิดใช้งานตัวเลือก บันทึกอัตโนมัติ 30 วินาทีหลังจากที่ข้อมูลมีการเปลี่ยนแปลง และข้อมูลยังไม่ได้บันทึกในฟอร์ม
  • โค้ดดําเนินการเมธอด formContext.data.save และมีข้อมูลที่ยังไม่ได้บันทึกในแบบฟอร์ม
  • โค้ดดําเนินการเมธอด formContext.data.refresh ที่ส่งผ่านค่าจริงเป็นพารามิเตอร์แรกและข้อมูลที่ไม่ได้บันทึกในแบบฟอร์ม

Note

เหตุการณ์OnSaveสําหรับการนัดหมาย การนัดหมายที่เป็นกิจวัตร หรือระเบียนกิจกรรมการบริการจะยกเลิกการดําเนินการบันทึกและใช้Bookข้อความเพื่อบันทึกการเปลี่ยนแปลงแทน หรือUpdateCreate เนื่องจากลักษณะการทํางานนี้ และ OnSavePostSave ตัวจัดการเหตุการณ์สําหรับตารางเหล่านี้ไม่ทํางาน

เมื่อต้องการตรวจสอบปุ่มที่ถูกคลิกเพื่อดําเนินการบันทึก ให้ใช้เมธอด getSaveMode

คุณสามารถยกเลิกการบันทึกได้โดยใช้เมธอด preventDefault ภายในวัตถุอาร์กิวเมนต์เหตุการณ์ สามารถเข้าถึง preventDefault วิธีการ นี้ได้โดยใช้เมธอด getEventArgs ที่เป็นส่วนหนึ่งของบริบทการดําเนินการ บริบทการดําเนินการจะถูกส่งผ่านไปยังตัวจัดการเหตุการณ์ของฟอร์มโดยอัตโนมัติ

การสนับสนุนตัวจัดการเหตุการณ์แบบอะซิงโครนัส

เหตุการณ์ OnSave มีความสามารถในการรอสัญญาที่ส่งกลับโดยตัวจัดการเหตุการณ์เพื่อชําระก่อนบันทึก ช่วยให้ OnSave เหตุการณ์เป็นแบบอะซิงโครนัส ("อะซิงโครนัส")

เหตุการณ์ OnSave จะกลายเป็นต่างเวลาเมื่อ OnSave ตัวจัดการเหตุการณ์ส่งกลับสัญญา การบันทึกบันทึกเกิดขึ้นเมื่อสัญญาแต่ละอย่างถูกส่งกลับมาโดยตัวจัดการได้รับการแก้ไข สําหรับสัญญาใด ๆ ที่กลับมามีขีดจํากัด 10 วินาทีสําหรับสัญญาแต่ละรายการหลังจากที่แพลตฟอร์มพิจารณาว่าจะหมดเวลา การหมดเวลานี้จะใช้ต่อสัญญา ตัวอย่างเช่น ถ้าเรามีห้าสัญญาที่ส่งคืน เวลารอทั้งหมดคือ 50 วินาที

หากสัญญาถูกปฏิเสธหรือหมดเวลา การดําเนินการบันทึกจะยังคงทํางานคล้ายกับข้อผิดพลาดของสคริปต์ปัจจุบัน ใช้เมธอด preventDefault ภายในวัตถุอาร์กิวเมนต์เหตุการณ์ในตัวจัดการเฉพาะถ้าคุณต้องการป้องกันไม่ให้เหตุการณ์การบันทึกเกิดขึ้นหากมีข้อผิดพลาด/สัญญาที่ถูกปฏิเสธ/ตัวจัดการหมดเวลา

คุณยังสามารถยกเลิกการบันทึกโดยไม่คํานึงถึงข้อผิดพลาดในตัวจัดการ หรือไม่ได้ใช้เมธอด preventDefault ภายในวัตถุอาร์กิวเมนต์เหตุการณ์ ถ้ามีการเรียกใช้วิธีนี้ เหตุการณ์ Async OnSave จะรอให้สัญญาตกลงทั้งหมด แต่การบันทึกจะไม่เกิดขึ้น การเรียกใช้วิธีนี้หมายความว่าตรรกะภายใน .then() & .catch() จะดําเนินการ

เหตุการณ์ OnSave จะรอให้มีสัญญาหนึ่งฉบับที่ส่งคืนต่อตัวจัดการ หากต้องมีสัญญาหลายข้อขอแนะนําให้ครอบคลุมสัญญาทั้งหมดด้วย Promise.all() วิธีและส่งคืนสัญญาที่ให้ผลลัพธ์เดียว สําหรับตัวจัดการหลายรายที่ส่งคืนสัญญาเราขอแนะนําให้คุณสร้างตัวจัดการหนึ่งตัวที่เรียกใช้เหตุการณ์ทั้งหมดและส่งคืนสัญญาเดียวที่ครอบคลุมสัญญาที่จําเป็นทั้งหมด แนวทางปฏิบัตินี้คือการลดเวลารอที่เกิดจากการหมดเวลา

ตัวอย่าง: เมื่อต้องใช้ตัวจัดการ OnSave async

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

ในสถานการณ์นี้ เนื่องจากมีกระบวนการต่างเวลาหลายรายการและการเรียกทั้งสองรายการส่งคืนสัญญาเดียว ให้ครอบคลุมทั้งสองอย่างใน Promise.all() วิธีการ

Note

คุณสามารถใช้ preventDefault เมธอด แบบซิงโครนัสเท่านั้น

เช่น:

 function myHandler() {
    return Promise.all([getWorkOrderPromise, getCustomerAssetPromise]).then((values) => {
        var workOrder = values[0];
        var customerAsset = values[1];
        // Perform validation
        if (isValid(workOrder, customerAsset)) {
            return Promise.resolve();
        }
        return Promise.reject(new Error("Validation failed for the work order and customer asset"));
   });
 }

เปิดใช้งานตัวจัดการ OnSave async โดยใช้การตั้งค่าแอป

หากต้องการใช้ตัวจัดการ async onSave ให้เปิดคุณลักษณะผ่านการตั้งค่าแอป:

  1. ไปที่ https://make.powerapps.com

  2. ตรวจสอบให้แน่ใจว่าคุณเลือกสภาพแวดล้อมที่ถูกต้อง

  3. เลือก แอป จากบานหน้าต่างนำทางด้านซ้าย

  4. เลือกแอป เลือก ... (จุดไข่ปลา) แล้วเลือก แก้ไข

  5. เลือก การตั้งค่า จากแถบคําสั่ง

  6. เมื่อกล่องโต้ตอบเปิดขึ้น ให้เลือก คุณลักษณะ

  7. เปิดตัวจัดการ Async บนบันทึก

  8. เลือก บันทึก

    สกรีนช็อตของการตั้งค่าคุณลักษณะตัวจัดการ Async onSave เปิดอยู่ในกล่องโต้ตอบการตั้งค่าแอป

ปิดใช้งานการหมดเวลาของตัวจัดการ Async OnSave

เมื่อคุณใช้ตัวจัดการต่าง OnSave เวลา แบบฟอร์มจะรอให้สัญญาถูกส่งคืนโดยตัวจัดการที่จะเติมเต็ม เพื่อให้แน่ใจว่าการบันทึกฟอร์มเสร็จสมบูรณ์ในเวลาที่เหมาะสม ตัวจัดการจะแสดงข้อยกเว้นการหมดเวลาหลังจาก 10 วินาทีเพื่อแจ้งให้คุณทราบเพื่อปรับแต่งตัวจัดการต่างเวลา OnSave เพื่อประสิทธิภาพการทํางานที่ดีขึ้น

มีสถานการณ์ที่ต้องหยุด OnSave ตัวจัดการเป็นเวลานานกว่า 10 วินาที ตัวอย่างกําลังเปิดกล่องโต้ตอบและรอให้ผู้ใช้ป้อนข้อมูลก่อนที่จะบันทึกต่อไป เพื่อให้แน่ใจว่าการดําเนินการต่างเวลารอสําหรับสัญญาที่จะแก้ไข ให้ใช้วิธีการ disableAsyncTimeout

Note

คุณต้องโทร disableAsyncTimeout ก่อนคําสั่งรอหรือการโทรต่างเวลา

เช่น:

async function myHandler(context) {  
     context.getEventArgs().disableAsyncTimeout();
     // The 10000ms time out will not be disabled if the above line does not come before all async awaits
     await Xrm.Navigation.openConfirmDialog({ text: "Are you sure you want to save?" });
 }

เมื่อคุณเรียกใช้ disableAsyncTimeout ไม่มีการหมดเวลาสําหรับตัวจัดการนั้นจะไม่ถูกนําไปใช้ มันยังคงรอให้สัญญาของผู้ดูแลที่จะปฏิบัติตาม

รูปแบบนี้สามารถส่งผลกระทบต่อประสิทธิภาพการทํางานของการบันทึกฟอร์ม

เหตุการณ์ OnSave บนตาราง
เหตุการณ์ (การอ้างอิง Client API)
เหตุการณ์ในฟอร์มและกริดในแอปแบบจำลอง