Evento OnSave form (riferimento api client) nelle app basate su modello

L'evento del modulo OnSave nelle app basate su modello consente di eseguire la logica, convalidare i dati o annullare un salvataggio prima del salvataggio di un record. L'evento OnSave si verifica quando:

  • L'utente seleziona il pulsante Salva o Aggiorna nella barra dei comandi, anche quando non sono presenti dati modificati da salvare.
  • Il codice esegue il metodo formContext.data.entity.save , anche quando non sono presenti dati modificati da salvare.
  • L'utente si allontana dal modulo e nel modulo sono presenti dati non salvati.
  • L'opzione Salvataggio automatico è abilitata, 30 secondi dopo la modifica dei dati e i dati non salvati nel modulo.
  • Il codice esegue il metodo formContext.data.save e nel modulo sono presenti dati non salvati.
  • Il codice esegue il metodo formContext.data.refresh passando un valore true come primo parametro e nel modulo sono presenti dati non salvati.

Annotazioni

L'evento OnSave per l'appuntamento, l'appuntamento ricorrente o i record di attività del servizio annulla l'operazione di salvataggio e usa il Book messaggio per salvare la modifica anziché Create o Update. A causa di questo comportamento e OnSavePostSave i gestori eventi per queste tabelle non funzionano.

Per determinare quale pulsante è stato fatto clic per eseguire il salvataggio, usare il metodo getSaveMode .

È possibile annullare l'azione di salvataggio usando il metodo preventDefault all'interno dell'oggetto argomenti dell'evento. Il preventDefault metodo è accessibile usando il metodo getEventArgs che fa parte del contesto di esecuzione. Il contesto di esecuzione viene passato automaticamente al gestore eventi del modulo.

Supporto del gestore eventi asincrono

L'evento OnSave può attendere la restituzione delle promesse restituite dai gestori eventi prima del salvataggio, consentendo all'evento OnSave di essere asincrono ("asincrono").

L'evento OnSave diventa asincrono quando il OnSave gestore eventi restituisce una promessa. Il salvataggio del record si verifica quando ogni promessa restituita da un gestore viene risolta. Per tutte le promesse restituite, è previsto un limite di 10 secondi per ogni promessa, dopo che la piattaforma considera timeout le promesse. Questo timeout viene applicato per promessa. Ad esempio, se sono state restituite cinque promesse, il tempo di attesa totale è 50 secondi.

Se la promessa viene rifiutata o si verifica il timeout, l'operazione di salvataggio continua a comportarsi in modo analogo agli errori di script correnti. Utilizzare il metodo preventDefault all'interno dell'oggetto argomenti dell'evento in quel gestore specifico se si desidera impedire che l'evento di salvataggio si verifichi se si verifica un errore di script o una promessa rifiutata o un gestore timeout.

È anche possibile annullare l'operazione di salvataggio indipendentemente dall'errore nel gestore o non usando il metodo preventDefault all'interno dell'oggetto argomenti dell'evento. Se questo metodo viene chiamato, l'evento Async OnSave attende che tutte le promesse vengano risolte, ma il salvataggio non si verificherà. La chiamata a questo metodo indica che la logica all'interno .then() di e .catch() verrà eseguita.

L'evento OnSave attende una promessa restituita per ogni gestore. Se sono necessarie più promesse, è consigliabile eseguire il wrapping di tutte le promesse nel Promise.all() metodo e restituire la singola promessa risultante. Per più gestori che restituiscono tutte una promessa, è consigliabile creare un gestore che chiama tutti gli eventi e restituire una singola promessa che esegue il wrapping di tutte le promesse necessarie. Questa procedura consiste nel ridurre al minimo i tempi di attesa causati dal timeout.

Esempio: quando usare gestori OnSave asincroni

Prendere in considerazione la creazione di un'attività di servizio ordini di lavoro in cui è necessario verificare che l'asset cliente selezionato abbia lo stesso account elencato nell'ordine di lavoro. Il recupero dell'account nell'ordine di lavoro e l'asset cliente sono entrambi processi asincroni ed è necessario completare entrambi prima di poter convalidare.

In questo scenario, poiché sono presenti più processi asincroni ed entrambe le chiamate restituiscono una singola promessa, eseguire il wrapping di entrambi nel Promise.all() metodo .

Annotazioni

È possibile usare il preventDefault metodo solo in modo sincrono.

Per esempio:

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

Abilitare gestori onSave asincroni usando un'impostazione dell'app

Per usare gestori onSave asincroni, attivare la funzionalità tramite un'impostazione dell'app:

  1. Passare a https://make.powerapps.com.

  2. Assicurarsi di selezionare l'ambiente corretto.

  3. Selezionare App nel riquadro di spostamento a sinistra.

  4. Selezionare l'app, selezionare ... (puntini di sospensione) e quindi selezionare Modifica.

  5. Selezionare Impostazioni dalla barra dei comandi.

  6. Quando si apre la finestra di dialogo, selezionare Funzionalità.

  7. Attivare il gestore Async onSave.

  8. Seleziona Salva.

    Screenshot dell'impostazione della funzionalità del gestore di Async onSave attivata nella finestra di dialogo Impostazioni app.

Disabilitare i timeout del gestore onSave asincrono

Quando si usa un gestore asincrono OnSave , il modulo attende che la promessa restituita dal gestore venga soddisfatta. Per garantire che il salvataggio del modulo venga completato in modo tempestivo, il gestore genera un'eccezione di timeout dopo 10 secondi per informare l'utente di ottimizzare il gestore asincrono OnSave per ottenere prestazioni migliori.

Esistono scenari in cui è necessaria la sospensione del OnSave gestore per più di 10 secondi. Un esempio è l'apertura di una finestra di dialogo e l'attesa dell'input dell'utente prima di continuare a salvare. Per assicurarsi che l'operazione asincrona attenda la risoluzione della promessa, usare il metodo disableAsyncTimeout .

Annotazioni

È necessario chiamare disableAsyncTimeout prima di qualsiasi istruzione await o chiamate asincrone.

Per esempio:

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

Quando si chiama disableAsyncTimeout, il timeout per tale gestore non viene applicato. Continua ad aspettare che la promessa del gestore venga soddisfatta.

Questo modello può influire sulle prestazioni del salvataggio del modulo.

Grid OnSave, evento
Eventi (informazioni di riferimento sulle API client)
Eventi in moduli e griglie nelle app basate su modello