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