Σημείωση
Η πρόσβαση σε αυτή τη σελίδα απαιτεί εξουσιοδότηση. Μπορείτε να δοκιμάσετε να συνδεθείτε ή να αλλάξετε καταλόγους.
Η πρόσβαση σε αυτή τη σελίδα απαιτεί εξουσιοδότηση. Μπορείτε να δοκιμάσετε να αλλάξετε καταλόγους.
Το OnSave συμβάν προκύπτει όταν:
- Ο χρήστης επιλέγει το κουμπί Αποθήκευση ή ανανέωση στη γραμμή εντολών, ακόμα και όταν δεν υπάρχουν τροποποιημένα δεδομένα για αποθήκευση.
- Ο κώδικας εκτελεί τη μέθοδο formContext.data.entity.save , ακόμα και όταν δεν υπάρχουν τροποποιημένα δεδομένα προς αποθήκευση.
- Ο χρήστης απομακρύνεται από τη φόρμα και υπάρχουν μη αποθηκευμένα δεδομένα στη φόρμα.
- Η επιλογή Αυτόματη αποθήκευση είναι ενεργοποιημένη, 30 δευτερόλεπτα μετά την αλλαγή των δεδομένων και υπάρχουν μη αποθηκευμένα δεδομένα στη φόρμα.
- Ο κώδικας εκτελεί τη μέθοδο formContext.data.save και υπάρχουν μη αποθηκευμένα δεδομένα στη φόρμα.
- Ο κώδικας εκτελεί τη μέθοδο formContext.data.refresh μεταβιβάζοντας μια τιμή true ως την πρώτη παράμετρο και υπάρχουν μη αποθηκευμένα δεδομένα στη φόρμα.
Note
Το OnSave συμβάν για εγγραφές δραστηριότητας συνάντησης, περιοδικής συνάντησης ή υπηρεσίας θα ακυρώσει τη λειτουργία αποθήκευσης και θα χρησιμοποιήσει το Book μήνυμα για να συνεχίσει την αλλαγή αντί Create για το ή Update. Για αυτόν τον λόγο, OnSave τα άτομα PostSave που χειρίζονται συμβάντα για αυτούς τους πίνακες δεν θα λειτουργούν.
Για να προσδιορίσετε το κουμπί στο οποίο έγινε κλικ για εκτέλεση της αποθήκευσης, χρησιμοποιήστε τη μέθοδο getSaveMode .
Μπορείτε να ακυρώσετε την ενέργεια αποθήκευσης χρησιμοποιώντας τη μέθοδο preventDefault στο αντικείμενο ορισμάτων συμβάντων. Η μέθοδος preventDefault είναι προσβάσιμη χρησιμοποιώντας τη μέθοδο getEventArgs που αποτελεί μέρος του περιβάλλοντος εκτέλεσης. Το περιβάλλον εκτέλεσης μεταβιβάζεται αυτόματα στο πρόγραμμα χειρισμού συμβάντων φόρμας.
Ασύγχρονη υποστήριξη προγράμματος χειρισμού συμβάντων
Το συμβάν OnSave έχει τη δυνατότητα να περιμένει υποσχέσεις που επιστρέφονται από τους χειρισμούς συμβάντων για να εγκατασταθούν πριν από την αποθήκευση, επιτρέποντας στο OnSave συμβάν να είναι ασύγχρονο ("ασύγχρονο").
Το OnSave συμβάν γίνεται ασύγχρονο όταν ο OnSave χειρισμός συμβάντων επιστρέφει μια υπόσχεση. Η αποθήκευση της εγγραφής συμβαίνει όταν κάθε υπόσχεση που επιστρέφεται από έναν χειρισμό επιλύεται. Για οποιεσδήποτε υποσχέσεις που επιστρέφονται, υπάρχει ένα όριο 10 δευτερολέπτων για κάθε υπόσχεση, αφού η πλατφόρμα εξετάζει τις υποσχέσεις που πρέπει να λήξει. Αυτό το χρονικό όριο ισχύει ανά υπόσχεση. Για παράδειγμα, εάν επιστραφούν πέντε υποσχέσεις, ο συνολικός χρόνος αναμονής είναι 50 δευτερόλεπτα.
Εάν η υπόσχεση απορριφθεί ή λήξει, η λειτουργία αποθήκευσης συνεχίζει να συμπεριφέρεται παρόμοια με τα τρέχοντα σφάλματα δέσμης ενεργειών. Χρησιμοποιήστε τη μέθοδο preventDefault στο αντικείμενο ορισμάτων συμβάντος στο συγκεκριμένο πρόγραμμα χειρισμού εάν θέλετε να αποτρέψετε την εμφάνιση του συμβάντος αποθήκευσης, εάν λήξει το χρονικό όριο σφάλματος/απόρριψης της υπόσχεσης ή του προγράμματος χειρισμού δέσμης ενεργειών.
Μπορείτε, επίσης, να ακυρώσετε τη λειτουργία αποθήκευσης ανεξάρτητα από το σφάλμα στο πρόγραμμα χειρισμού ή να μην χρησιμοποιήσετε την αποτρέψτεΠροβολή στο αντικείμενο ορισμάτων συμβάντων. Εάν καλείται αυτή η μέθοδος, το συμβάν Async OnSave περιμένει όλες τις υποσχέσεις να διευθετηθούν, αλλά η αποθήκευση δεν θα πραγματοποιηθεί. Η κλήση αυτής της μεθόδου σημαίνει ότι η λογική εντός .then() του και .catch() θα εκτελεστεί.
Το OnSave συμβάν περιμένει μια υπόσχεση που επιστρέφεται ανά χειρισμό. Εάν απαιτούνται πολλές υποσχέσεις, συνιστάται να τυλίξετε όλες τις υποσχέσεις στη Promise.all() μέθοδο και να επιστρέψετε τη μοναδική υπόσχεση που προκύπτει. Για πολλαπλούς χειρισμούς που επιστρέφουν όλοι μια υπόσχεση, σας συνιστούμε να δημιουργήσετε έναν χειρισμό που καλεί όλα τα γεγονότα και να επιστρέψετε μια μοναδική υπόσχεση που ολοκληρώνει όλες τις απαιτούμενες υποσχέσεις. Αυτή η πρακτική είναι να ελαχιστοποιούνται οι χρόνοι αναμονής που προκαλούνται από το χρονικό όριο.
Παράδειγμα σεναρίου σχετικά με το πότε πρέπει να χρησιμοποιείτε ασύγχρονους χειρισμούς OnSave
Εξετάστε το ενδεχόμενο να δημιουργήσετε μια εργασία υπηρεσίας παραγγελίας εργασίας, πρέπει να επικυρώσετε ότι το επιλεγμένο στοιχείο πελάτη έχει τον ίδιο λογαριασμό που παρατίθεται στην παραγγελία εργασίας. Η ανάκτηση του λογαριασμού στην παραγγελία εργασίας και το στοιχείο πελάτη είναι και οι δύο ασύγχρονες διαδικασίες και πρέπει να ολοκληρωθούν πριν πραγματοποιηθεί η επικύρωση.
Σε αυτό το σενάριο, δεδομένου ότι υπάρχουν πολλές ασύγχρονες διαδικασίες και οι δύο κλήσεις επιστρέφουν μια μοναδική υπόσχεση, περικλείοντας και τις δύο στη 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"));
});
}
Ενεργοποίηση Async OnSave με χρήση της ρύθμισης εφαρμογής
Για να χρησιμοποιήσετε ασύγχρονους χειρισμούς onSave, πρέπει να τους ενεργοποιήσετε μέσω μιας ρύθμισης εφαρμογής:
Μετάβαση σε https://make.powerapps.com.
Βεβαιωθείτε ότι έχετε επιλέξει το σωστό περιβάλλον.
Επιλέξτε Εφαρμογές στο αριστερό παράθυρο περιήγησης.
Επιλέξτε την εφαρμογή και, στη συνέχεια, επιλέξτε ... (αποσιωπητικά). Επιλέξτε Επεξεργασία.
Επιλέξτε Ρυθμίσεις από τη γραμμή εντολών.
Όταν ανοίξει το παράθυρο διαλόγου, επιλέξτε Δυνατότητες.
Ενεργοποιήστε την async στην επιλογή Χειρισμός αποθήκευσης.
Επιλέξτε Αποθήκευση.
Async OnSave timeouts
Όταν χρησιμοποιείτε έναν ασύγχρονο 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 πλέγματος
Συμβάντα (αναφορά API προγράμματος-πελάτη)
Συμβάντα σε φόρμες και πλέγματα σε εφαρμογές που καθορίζονται από μοντέλο