Événement OnSave de formulaire (référence de l’API client) dans les applications basées sur un modèle
L’événement se produit lorsque : OnSave
- L’utilisateur sélectionne le bouton Enregistrer ou Actualiser dans la barre de commandes, même lorsqu’aucune donnée modifiée n’est à enregistrer.
- Le code exécute la méthode formContext.data.entity.save , même lorsqu’il n’y a aucune donnée modifiée à enregistrer.
- L’utilisateur quitte le formulaire et qu’il existe des données non enregistrées dans le formulaire.
- L’option d’enregistrement automatique est activée, 30 secondes après la modification de données et il existe des données non enregistrées dans le formulaire.
- Le code exécute la méthode formContext.data.save et il y a des données non enregistrées dans le formulaire.
- Le code exécute la méthode formContext.data.refresh en passant une valeur true comme premier paramètre et il y a des données non enregistrées dans le formulaire.
Note
L’événement pour les enregistrements de rendez-vous, de rendez-vous récurrent ou d’activité de service Annuler l’opération de sauvegarde et utilisera le message pour conserver la modification plutôt que OnSave
ou Book
. Create
Update
Pour cette raison, OnSave
et PostSave
les gestionnaires d’événements pour ces tables ne fonctionneront pas.
Pour déterminer sur quel bouton a été cliqué pour effectuer l’enregistrement, utilisez la méthode getSaveMode .
Vous pouvez annuler l’action d’enregistrement en utilisant la méthode preventDefault au sein de l’objet d’arguments de l’événement. La méthode preventDefault est accessible à l’aide de la méthode getEventArgs qui fait partie du contexte d’exécution. Le contexte d’exécution est automatiquement passé au gestionnaire d’événements de formulaire.
Prise en charge du gestionnaire d’événements asynchrones
L’événement OnSave a la capacité d’attendre que les promesses renvoyées par les gestionnaires d’événements soient réglées avant l’enregistrement, ce qui permet à l’événement d’être asynchrone ("async"). OnSave
L’événement devient asynchrone lorsque le gestionnaire d’événements renvoie une promesse. OnSave
OnSave
Sauvegarder l’enregistrement se produit lorsque chaque promesse renvoyée par un gestionnaire est résolue. Pour toutes les promesses renvoyées, il y a une limite de 10 secondes pour chaque promesse, après quoi la plateforme considère que les promesses ont expiré. Ce délai d’attente est appliqué par promesse. Par exemple, si nous avons cinq promesses renvoyées, le temps d’attente total est de 50 secondes.
Si la promesse est rejetée ou parvient à expiration, l’opération d’enregistrement continue de se comporter de la même manière par rapport aux erreurs de script en cours. Utilisez la méthode preventDefault dans l’objet d’arguments d’événement dans ce gestionnaire particulier si vous souhaitez empêcher l’événement de sauvegarde de se produire en cas d’erreur de script/promesse rejetée ou d’expiration du délai du gestionnaire.
Vous pouvez également Annuler l’opération de sauvegarde indépendamment de l’erreur dans le gestionnaire ou non en utilisant la méthode preventDefault dans l’objet d’arguments d’événement. Si cette méthode est appelée, l’événement OnSave asynchrone attend toujours que toutes les promesses soient réglées, mais l’enregistrement ne se produit pas. L’appel de cette méthode signifie que la logique à l’intérieur .then()
& .catch()
s’exécutera.
L’événement attend une promesse renvoyée par gestionnaire. OnSave
Si plusieurs promesses sont requises, il est recommandé de Inclure dans un wrapper toutes les promesses dans la méthode Promise.all()
et de renvoyer la promesse unique résultante. Pour plusieurs gestionnaires qui renvoient tous une promesse, nous vous recommandons de créer un gestionnaire qui appelle tous les événements et renvoie une seule promesse qui inclut dans un wrapper toutes les promesses requises. Cette pratique consiste à minimiser les délais causés par le temps d’attente.
Exemple de scénario d’utilisation des gestionnaires OnSave asynchrones
Si vous envisagez de créer une tâche de service d’ordre de travail, vous devez valider que l’actif client sélectionné a le même compte répertorié dans l’ordre de travail. La récupération du compte sur l’ordre de travail et l’actif client sont tous deux des processus asynchrones qui doivent être terminés avant que la validation puisse avoir lieu.
Dans ce scénario, étant donné qu’il existe plusieurs processus asynchrones et que les deux appels renvoient une seule promesse en les enveloppant tous les deux dans la méthode Promise.all()
.
Note
La méthode ne peut être utilisée que de manière synchrone. preventDefault
Par exemple :
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"));
});
}
Activer l’événement OnSave asynchrone à l’aide des paramètres de l’application
Pour utiliser les gestionnaires onSave asynchrones, vous devez les activer via un paramètre d’application :
Accéder à https://make.powerapps.com.
Veillez à sélectionner l’environnement correct.
Cliquez sur Applications dans le volet de navigation de gauche.
Sélectionner l’application puis Sélectionner ... (ellipses). Cliquez sur Modifier.
Cliquez sur Paramètres dans la barre de commandes.
Lorsque la boîte de dialogue s’ouvre, Sélectionner Fonctionnalités.
Activer le gestionnaire onSave asynchrone.
Sélectionnez Enregistrer.
Délais d’attente OnSave asynchrones
Lorsque vous utilisez un gestionnaire asynchrone, le formulaire attend que la promesse renvoyée par le gestionnaire soit tenue. OnSave
Pour garantir que l’enregistrement du formulaire se termine en temps opportun, le gestionnaire génère une exception de délai d’attente après 10 secondes pour vous indiquer que vous devez régler le gestionnaire async OnSave
pour de meilleures performances.
Il existe des scénarios dans lesquels il est nécessaire de mettre en pause le gestionnaire pendant plus de 10 secondes. OnSave
Un exemple consiste à ouvrir une boîte de dialogue et à attendre la saisie de l’utilisateur avant de poursuivre l’enregistrement. Pour vous assurer que l’opération asynchrone attend que la promesse soit résolue, utilisez la méthode disableAsyncTimeout .
Note
Vous devez appeler disableAsyncTimeout
avant toute instruction d’attente ou tout appel asynchrone.
Par exemple :
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?" });
}
Lorsque disableAsyncTimeout est appelé, le délai d’attente pour ce gestionnaire n’est pas appliqué. Il continue d’attendre que la promesse de ce gestionnaire soit exécutée.
Ce modèle doit être utilisé avec prudence, car il peut affecter les performances d’enregistrement du formulaire.
Articles associés
Événement OnSave grille
Événements (référence API client)
Événements dans les formulaires et les grilles dans les applications pilotées par modèle