Creare app canvas di grandi dimensioni e complesse

La maggior parte degli articoli in questa sezione della documentazione riguarda le prestazioni di runtime delle app sperimentate dalle persone che le utilizzano. Questo articolo descrive le prestazioni delle app sperimentate dalle persone che le creano.

Man mano che le app diventano più complesse e di più grandi dimensioni, Power Apps Studio deve caricare e gestire un maggior numero di controlli, formule e origini dati, tutti con interdipendenze che crescono in modo esponenziale. Il tempo di caricamento di Power Apps Studio può risultare più lungo e funzionalità quali IntelliSense e la codifica a colori possono subire ritardi. Usa gli elementi consigliati seguenti per utilizzare al meglio app di grandi dimensioni e complesse in Power Apps Studio. Questi elementi possono anche contribuire a migliorare le prestazioni di runtime delle tue app.

Gli esempi in questo articolo usano la soluzione di esempio Risposta di emergenza.

Usa App.Formulas invece di App.OnStart

Suggerimento

Puoi utilizzare la funzione With e le proprietà di output personalizzato dei componenti della canvas come alternativa alle formule denominate.

Il modo migliore di ridurre il tempo di caricamento per Power Apps Studio e la tua app è sostituire l'inizializzazione di variabili e raccolte in App.OnStart con formule con nome in App.Formulas.

Osserviamo l'esempio seguente, che utilizza App.OnStart.

// Get the color of text on a dark background.
Set(varColorOnDark,RGBA(0, 0, 0, 1));

// Get the color of the menu icons.
Set(varColorMenuIcon,"#0070a9");

// Get the styles for a form.
Set(varFormStyle,
    {
        DataCard: { Height: 50 },
        Title: { Height: 50, Size: 21, Color: varColorOnDark },
        Control: { Height: 50, Size: 18 },
        Label: { Size: 18, Color: varColorOnDark }
    }
);

ClearCollect(
    FacilitiesList,
    ForAll(
        Facilities,
        { Name: 'Facility Name', Id: Facility }
    )
);
If(
    Not IsBlank(Param("FacilityID")),
    Set(ParamFacility,
        LookUp(
            FacilitiesList,
            Id = GUID(Param("FacilityID"))
        ).Name
    );
);

Poiché sono una sequenza di istruzioni, la tua app deve valutare queste chiamate Set e Collect nell'ordine per poter visualizzare la prima schermata, che rende il caricamento dell'app più lento. Inoltre, poiché l'intera proprietà App.OnStart deve essere considerata nel suo insieme con ordine preservato ed errori aggregati prima di restituire il risultato finale, la formula è complessa da analizzare per Power Apps Studio.

Esiste un modo migliore. Usa invece App.Formulas e definisci queste variabili e raccolte come formule con nome, come nell'esempio seguente.

// Get the color of text on a dark background.
varColorOnDark = RGBA(0, 0, 0, 1);

// Get the color of the menu icons.
varColorMenuIcon = "#0070a9";

// Get the styles for a form.
varFormStyle = 
    {
        DataCard: { Height: 50 },
        Title: { Height: 50, Size: 21, Color: varColorOnDark },
        Control: { Height: 50, Size: 18 },
        Label: { Size: 18, Color: varColorOnDark }
    };

FacilitiesList =
    ForAll(
        Facilities,
        { Name: 'Facility Name', Id: Facility }
    );

ParamFacility = 
    If( Not IsBlank(Param("FacilityID")),
        LookUp(
            FacilitiesList,
            Id = GUID(Param("FacilityID"))
        ).Name,
        Blank()
    );

Può sembrare una piccola modifica, ma può avere un impatto enorme. Poiché ogni formula con nome è indipendente dalle altre, Power Apps Studio può analizzarle in modo indipendente, dividendo efficacemente una App.OnStart di grandi dimensioni in parti più piccole. Abbiamo visto che il tempo di caricamento di Power Apps Studio diminuisce anche dell'80% solo con questa modifica.

Inoltre la tua app si carica più velocemente perché non deve valutare queste formule fino a quando non ha bisogno del risultato. La prima schermata dell'app viene visualizzata immediatamente.

Le formule con nome non possono essere utilizzate in tutte le situazioni perché non è possibile modificarle o utilizzarle con Set. Alcune situazioni richiedono l'uso di una variabile di stato che può essere modificata. Set è perfetta per queste situazioni e dovresti continuare a usarla. Tuttavia, spesso utilizzi variabili globali in OnStart per impostare valori statici che non cambiano. In tali casi, una formula con nome è la scelta migliore.

Poiché le formule con nome sono immutabili, il prefisso var (abbreviazione di "variabile") come convenzione di denominazione non è più appropriato. Non abbiamo cambiato i nomi in questo esempio perché sarebbero necessarie modifiche al resto dell'app.

È tentante inserire una formula con nome in App.OnStart, ma non lo facciamo perché non ha senso. Come proprietà di comportamento On, App.OnStart valuta ciascuna delle relative istruzioni nell'ordine, creando variabili globali e comunicando con i database solo una volta quando l'app viene caricata. Le formule con nome sono formule che definiscono come calcolare qualcosa quando necessario e sono sempre vere. È questa natura della formula che consente loro di essere indipendenti e consente all'app di completare il caricamento prima che vengano valutate.

Suddividi le formule lunghe

App.OnStart è uno degli esempi calzanti per formule lunghe e dovresti iniziare da qui, ma non è l'unico caso.

I nostri studi hanno dimostrato che quasi tutte le app con un tempo di caricamento lungo per Power Apps Studio hanno almeno una formula con più di 256.000 caratteri. Alcune app con tempi di caricamento più lunghi hanno formule con più di 1 milione di caratteri. Formule così lunghe mettono a dura prova Power Apps Studio.

A peggiorare le cose, copiare e incollare un controllo con una formula lunga duplica la formula nelle proprietà del controllo senza che venga realizzata. Power Apps è modellato su Excel, dove più copie di una formula sono comuni. Tuttavia, in Excel le formule sono limitate a un'espressione e a 8.000 caratteri. Le formule Power Apps possono diventare molto più lunghe con l'introduzione della logica imperativa e dell'operatore di concatenamento (; o ;; a seconda delle impostazioni locali).

La soluzione generale è dividere le formule lunghe in parti più piccole e riutilizzare quelle parti, come abbiamo fatto nella sezione precedente quando abbiamo cambiato le istruzioni Set/Collect in App.OnStart in formule con nome in App.Formulas. In altri linguaggi di programmazione, le parti riutilizzabili sono spesso chiamate subroutine o funzioni definite dall'utente. Puoi considerare le formule con nome come una forma semplice di funzione definita dall'utente senza parametri o effetti collaterali.

Usa formule con nome ovunque

Nell'esempio precedente, abbiamo utilizzato formule con nome in sostituzione di App.OnStart. Tuttavia, puoi utilizzarle per sostituire un calcolo ovunque in un'app.

Ad esempio, una delle schermate nella soluzione di esempio Risposta di emergenza include questa logica in Screen.OnVisible:

ClearCollect(
    MySplashSelectionsCollection,
    {
        MySystemCol: First(
            Filter(
                Regions,
                Region = MyParamRegion
            )
        ).System.'System Name',
        MyRegionCol: First(
            Filter(
                Regions,
                Region = MyParamRegion
            )
        ).'Region Name',
        MyFacilityCol: ParamFacility,
          MyFacilityColID:  LookUp(
            FacilitiesList,
            Id = GUID(Param("FacilityID"))
        ).Id
    }
); 

Questa formula può essere suddivisa in un insieme di formule con nome. Inoltre rende la formula più facile da leggere.

MyRegion = LookUp(
                    Regions,
                    Region = MyParamRegion
           );

MyFacility = LookUp(
                    FacilitiesList,
                    Id = GUID(Param("FacilityID")
            );

MySplashSelectionsCollection = 
    {
        MySystemCol: MyRegion.System.'System Name',
        MyRegionCol: MyRegion.'Region Name',
        MyFacilityCol: ParamFacility,
        MyFacilityColID:  MyFacility.Id
    };

Abbiamo estratto ParamFacility come formula con nome quando abbiamo spostato la maggior parte delle chiamate Set da App.OnStart in formule con nome in App.Formulas.

Le formule con nome vengono valutate solo quando i relativi valori sono necessari. Se la finalità originale dell'uso di Screen.OnVisible è stata di posticipare il lavoro finché non viene visualizzata la schermata, il lavoro deve essere ancora posticipato come formule con nome globali in App.Formulas.

Usa la funzione With

Puoi anche utilizzare la funzione With in una formula per suddividere la logica. Crea un record nel primo parametro con i valori che vuoi usare come campi, quindi utilizza quei campi nel secondo parametro per calcolare il valore restituito da With. Ad esempio, l'esempio precedente può essere scritto come una sola formula con nome:

MySplashSelectionsCollection = 
    With( { MyRegion: LookUp(
                            Regions,
                            Region = MyParamRegion
                      ),
            MyFacility: LookUp(
                            FacilitiesList,
                            Id = GUID(Param("FacilityID")
                      ) 
           },
           {
                MySystemCol: MyRegion.System.'System Name',
                MyRegionCol: MyRegion.'Region Name',
                MyFacilityCol: ParamFacility,
                MyFacilityColID:  MyFacility.Id
           }
    )

Uno svantaggio inerente all'uso di With in questo modo è che MyFacility non può utilizzare MyRegion perché sono definiti nella stessa funzione With, un problema non presente con formule con nome. Una soluzione è nidificare le funzioni With e utilizzare la parola chiave As per denominare il record per ciascuna di esse al fine di consentire un facile accesso a tutte le variabili With.

Usa componenti canvas

I componenti canvas vengono spesso utilizzati per creare un controllo dell'interfaccia utente che può essere posizionato nell'area di disegno proprio come un controllo. Puoi anche usarli senza posizionarli nell'interfaccia utente per eseguire calcoli con proprietà di output personalizzate come alternativa alle formule con nome. I componenti canvas sono facili da condividere tra le app con librerie dei componenti e, a differenza delle formule con nome, sono completamente supportati. Tuttavia, sono più difficili da configurare e utilizzare rispetto alle formule con nome.

Per suddividere la logica:

  1. In Power Apps Studio, passa alla scheda Componenti nella Visualizzazione ad albero.
  2. Creare un nuovo componente.
  3. Nel riquadro Proprietà, abilita Accedi all'ambito dell'app.
  4. Aggiungi una proprietà personalizzata.
  5. Imposta Tipo di proprietà su Output e Tipo dati in base alle esigenze.
  6. Seleziona Crea.
  7. Nel selettore delle proprietà accanto alla barra delle formule nella parte superiore della schermata, seleziona la nuova proprietà.
  8. Scrivi la formula per la logica da suddividere e riutilizzare.

Per utilizzare la logica:

  1. Passa alla scheda Schermi nella Visualizzazione ad albero.
  2. Nel riquadro Inserisci, espandi Personalizzato e inserisci il tuo componente.
  3. Per calcolare un valore con la proprietà, usa ComponentName.PropertyName.

Utilizza Seleziona con un controllo nascosto per la logica imperativa

La logica imperativa viene utilizzata per modificare lo stato con Set e Collect, inviare una notifica all'utente tramite Notifica, spostarsi in un'altra schermata o app con Naviga e Avvia nonché scrivere valori in un database con Patch, SubmitForm o RemoveIf.

Le formule con nome e le proprietà di output personalizzate dei componenti canvas non supportano la logica imperativa. Un modo comune di suddividere la logica imperativa consiste nell'usare la proprietà OnSelect di un controllo nascosto.

  1. Aggiungi un controllo Pulsante a una schermata.
  2. Imposta la proprietà OnSelect sulla logica imperativa che desideri eseguire.
  3. Imposta la proprietà Visible su false, poiché non è necessario che l'utente la veda o interagisca con essa.
  4. Chiama Select( Button ) quando desideri eseguire la logica imperativa.

Ad esempio, una delle schermate nel nostro esempio presenta la seguente proprietà OnSelect in un controllo Pulsante (questo semplice esempio è solo a scopo illustrativo; normalmente useresti questa tecnica solo per formule più lunghe).

btnAction_17.OnSelect = 
    Trace("Feedback Screen: Submit Button",TraceSeverity.Information);
    If(
        // Proceed if all forms are validated.
        And(
            FormFeedback.Valid
        ),
    
        // Set the updates to static variables.
        Set(updatesFeedback,Patch(Defaults('App Feedbacks'), FormFeedback.Updates));
        // Submit the first form. Subsequent actions can be found in the OnSuccess.
        SubmitForm(FormFeedback);
        ,
    
        Notify("Please complete all fields before proceeding",
               NotificationType.Warning,2000)
    );

Per suddividere questa logica in parti, possiamo inserire porzioni in controlli Pulsante e Selezionarli dall'originale:

btnTrace.OnSelect = 
    Trace("Feedback Screen: Submit Button",TraceSeverity.Information);

btnSubmit.OnSelect = 
    If(
        // Proceed if all forms are validated.
        And(
            FormFeedback.Valid
        ),
    
        // Set the updates to static variables.
        Set(updatesFeedback,Patch(Defaults('App Feedbacks'), FormFeedback.Updates));
        // Submit the first form. Subsequent actions can be found in OnSuccess.
        SubmitForm(FormFeedback);
        ,
    
        Notify("Please complete all fields before proceeding",
               NotificationType.Warning,2000)
    );

btnAction_17.OnSelect = 
    Select( btnTrace );
    Select( btnSubmit );

Questa tecnica funziona solo nella stessa schermata. Altre tecniche leggermente più complicate funzionano in tutte le schermate, come utilizzare il controllo Interruttore, impostare OnCheck sulla logica che desideri eseguire, impostare Predefinito su una variabile globale e quindi alternare la variabile globale con Set( global, true ); Set( global, false ) nel punto in cui desideri eseguire la logica.

In questo esempio, era già stata eseguita una suddivisione logica. Il commento menziona che "Le azioni successive possono essere trovate in OnSuccess". Questo evento esegue la logica imperativa dopo che il record è stato inviato correttamente, una soluzione specifica per la funzione SubmitForm.

Eseguire la partizione dell'app

Alcune app diventano migliaia di controlli e centinaia di origini dati, il che rallenta Power Apps Studio. Come per le formule lunghe, le app di grandi dimensioni possono essere suddivise in sezioni più piccole che funzionano insieme per creare un'esperienza utente unica.

Separare le app canvas

Un approccio consiste nell'implementare sezioni in app canvas separate e utilizzare la funzione Launch per navigare tra tali app e passare il contesto necessario.

Questo approccio è stato utilizzato nella Soluzione di esempio Risposta di emergenza. Le app separate gestiscono ciascuna delle aree principali dell'app complessiva. Le app condividono un componente di centralino comune attraverso una libreria di componenti che ogni app mostra nella relativa schermata di avvio:

Schermata dell'app canvas Soluzione di esempio Risposta di emergenza in esecuzione su un telefono che mostra il componente canvas del centralino.

Quando l'utente seleziona un'area, il componente usa i metadati sulle app disponibili e sull'app che ospita il componente. Se la schermata desiderata si trova in questa app (ovvero ThisItem.Screen non è vuota), viene effettuata una chiamata Navigate. Tuttavia, se la schermata desiderata si trova in un'altra app (ovvero ThisItem.PowerAppID non è vuota), viene utilizzata una funzione Launch con l'ID app della destinazione e il contesto FacilityID:

If(
    IsBlank(ThisItem.Screen),
    If(IsBlank(ThisItem.PowerAppID), 
        Launch(ThisItem.URL),           
        Launch("/providers/Microsoft.PowerApps/apps/" & ThisItem.PowerAppID, 
               "FacilityID", Home_Facility_DD.Selected.Id)
    ),
    Navigate(
        ThisItem.Screen,
        Fade
    )
);

Lo stato nell'app originale viene perso all'avvio di un'altra app. Assicurati di salvare qualsiasi stato prima di chiamare la funzione Launch. Scrivilo in un database, chiama SaveData o passa lo stato all'app di destinazione con parametri che vengono letti con la funzione Param.

App basata su modello con pagine personalizzate

Le sezioni possono anche essere implementate come pagine personalizzate. Le pagine personalizzate fungono da mini app canvas, con un contenitore di app basata su modello per la navigazione.

Nota

Puoi indicarci le tue preferenze di lingua per la documentazione? Partecipa a un breve sondaggio. (il sondaggio è in inglese)

Il sondaggio richiederà circa sette minuti. Non viene raccolto alcun dato personale (Informativa sulla privacy).