Freigeben über


Formular OnSave Ereignis (Client-API-Referenz) in modellgesteuerten Apps

Das OnSave Ereignis tritt ein, wenn:

  • Der Benutzer wählt die Schaltfläche Speichern oder Aktualisieren in der Befehlsleiste aus, auch wenn keine geänderten Daten zum Speichern vorhanden sind.
  • Der Code führt die Methode formContext.data.entity.save aus, auch wenn keine geänderten Daten zum Speichern vorhanden sind.
  • Der Benutzer verlässt das Formular und es befinden sich ungespeicherte Daten im Formular.
  • Die Option „AutoSave“ ist aktiviert, 30 Sekunden nachdem sich Daten geändert haben und sich ungespeicherte Daten im Formular befinden.
  • Der Code führt die Methode formContext.data.save aus und das Formular enthält nicht gespeicherte Daten.
  • Der Code führt die Methode formContext.data.refresh aus, übergibt als ersten Parameter einen wahren Wert und es befinden sich nicht gespeicherte Daten im Formular.

Anmerkung

Das OnSave Ereignis für Termine, wiederkehrende Termine oder Serviceaktivitätsdatensätze führt den Speichervorgang durch Abbrechen und verwendet die Book Nachricht, um die Änderung beizubehalten, anstatt Create oder Update. Aus diesem Grund funktionieren OnSave und PostSave Ereignishandler für diese Tabellen nicht.

Um zu ermitteln, auf welche Schaltfläche zum Speichern geklickt wurde, verwenden Sie die Methode getSaveMode .

Sie können die Speicheraktion abbrechen, indem Sie die preventDefault-Methode im Ereignisargumentobjekt bereitstellen. Auf die Methode preventDefault kann über die Methode getEventArgs zugegriffen werden, die Teil des Ausführungskontexts ist. Der Ausführungskontext wird automatisch an den Formularereignishandler weitergegeben.

Unterstützung für asynchrone Event-Handler

Das OnSave-Ereignis kann vor dem Speichern auf die Erfüllung von durch Ereignishandler zurückgegebenen Versprechen warten, wodurch das Ereignis asynchron („async“) sein kann. OnSave

Das OnSave Ereignis wird asynchron, wenn der OnSave Ereignishandler ein Versprechen zurückgibt. Das Speichern des Datensatzes erfolgt, wenn jedes von einem Handler zurückgegebenes Versprechen aufgelöst wird. Für alle Versprechen, die zurückgegeben werden, gibt es ein 10-Sekunden-Limit für jedes Versprechen, danach betrachtet die Plattform die Versprechen als abgelaufen. Dieses Zeitlimit wird für jedes Versprechen angewendet. Wenn zum Beispiel fünf Versprechen zurückgegeben werden, beträgt die Gesamtwartezeit 50 Sekunden.

Wenn das Versprechen abgelehnt wird oder eine Zeitüberschreitung auftritt, verhält sich der Speichervorgang weiterhin ähnlich wie bei den aktuellen Skriptfehlern. Verwenden Sie die Methode preventDefault innerhalb des Ereignisargumentobjekts in diesem bestimmten Handler, wenn Sie verhindern möchten, dass das Speicherereignis ausgeführt wird, wenn ein Skriptfehler/ein abgelehntes Versprechen vorliegt oder der Handler eine Zeitüberschreitung aufweist.

Sie können den Speichervorgang auch unabhängig vom Fehler im Handler mit Abbrechen ausführen oder die Methode preventDefault im Ereignisargumentobjekt nicht verwenden. Wenn diese Methode aufgerufen wird, wartet das Ereignis Async OnSave darauf, dass alle Versprechen eingelöst werden, aber die Speicherung wird nicht durchgeführt. Der Aufruf dieser Methode bedeutet, dass die Logik innerhalb von .then() & .catch() ausgeführt wird.

Das OnSave Ereignis wartet auf die Rückgabe eines Promises pro Handler. Wenn mehrere Promises erforderlich sind, wird empfohlen, alle Promises in der Promise.all() Methode mit Verpacken zu verknüpfen und das einzelne resultierende Promise zurückzugeben. Für mehrere Handler, die alle ein Versprechen zurückgeben, empfehlen wir Ihnen, einen Handler zu erstellen, der alle Ereignisse aufruft und ein einzelnes Versprechen zurückgibt, das alle erforderlichen Versprechen verpackt. Diese Praxis dient dazu, die durch die Zeitüberschreitung verursachten Wartezeiten zu minimieren.

Beispielszenario, wann async OnSave-Handler verwendet werden sollen

Wenn Sie eine Service-Aufgabe für einen Arbeitsauftrag erstellen, müssen Sie überprüfen, ob das ausgewählte Kunden-Asset dasselbe Konto hat, das auch im Arbeitsauftrag aufgeführt ist. Das Abrufen des Kontos auf dem Arbeitsauftrag und dem Kunden-Asset sind beides asynchrone Prozesse und müssen abgeschlossen werden, bevor die Validierung erfolgen kann.

Da es in diesem Szenario mehrere asynchrone Prozesse gibt und beide Aufrufe ein einzelnes Versprechen zurückgeben, indem beide in die Promise.all() -Methode eingeschlossen werden.

Anmerkung

Die preventDefault Methode kann nur synchron verwendet werden.

Zum Beispiel:

 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"));
   });
 }

Aktivieren Sie Async OnSave über die App-Einstellung

Um asynchrone onSave-Handler zu verwenden, müssen Sie sie über eine App-Einstellung aktivieren:

  1. Wechseln Sie zu https://make.powerapps.com.

  2. Stellen Sie sicher, dass Sie die richtige Umgebung auswählen.

  3. Wählen Sie im linken Navigationsbereich die Option Apps aus.

  4. Auswählen die App und dann Auswählen ... (Auslassungspunkte). Wählen Sie Bearbeiten.

  5. Wählen Sie auf der Befehlsleiste Einstellungen aus.

  6. Wenn das Dialogfeld geöffnet wird, Auswählen Funktionen.

  7. Aktivieren Sie den Async onSave-Handler.

  8. Wählen Sie Speichern.

    Async OnSave App-Einstellung

Asynchrone OnSave-Zeitüberschreitungen

Wenn Sie einen asynchronen OnSave Handler verwenden, wartet das Formular darauf, dass das vom Handler zurückgegebene Versprechen erfüllt wird. Um sicherzustellen, dass das Speichern des Formulars rechtzeitig abgeschlossen wird, löst der Handler nach 10 Sekunden eine Timeout-Ausnahme aus, um Sie darauf hinzuweisen, dass Sie den asynchronen OnSave Handler für eine bessere Leistung optimieren müssen.

Es gibt Szenarien, in denen der OnSave Handler länger als 10 Sekunden angehalten werden muss. Dies ist zum Beispiel beim Öffnen eines Dialogs und beim Warten auf die Eingabe des Benutzers zum Fortfahren des Speicherns der Fall. Um sicherzustellen, dass der asynchrone Vorgang auf die Einlösung des Versprechens wartet, verwenden Sie die Methode disableAsyncTimeout .

Anmerkung

Sie müssen disableAsyncTimeout vor allen Await-Anweisungen oder asynchronen Aufrufen aufrufen.

Zum Beispiel:

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?" });
 }

Wenn disableAsyncTimeout aufgerufen wird, wird das Timeout für diesen Handler nicht angewendet. Es wartet weiterhin darauf, dass das Versprechen des Handlers erfüllt wird.

Dieses Muster sollte mit Vorsicht verwendet werden, da es die Leistung des Formulars beim Speichern beeinträchtigen kann.

Raster OnSave-Ereignis
Ereignissse (Client-API-Referenz)
Ereignisse in Formularen und in Rastern in Modell-angetriebenen Apps