Creați aplicații mari și complexe planșă de lucru

Majoritatea articolelor din această secțiune a documentației acoperă performanța de rulare a aplicațiilor, așa cum au experimentat persoanele care le folosesc. Acest articol acoperă performanța aplicației așa cum au experimentat cei care le produc.

Pe măsură ce aplicațiile devin mai mari și mai complexe, Power Apps Studio trebuie să încarce și să gestioneze un număr mai mare de comenzi, formule și surse de date, toate cu interdependențe care cresc exponențial. Power Apps Studio Încărcarea poate dura mai mult, iar funcții precum IntelliSense și codarea culorilor pot întârzia. Utilizați recomandările care urmează pentru a lucra mai bine cu aplicații mari și complexe Power Apps Studio. Ele pot ajuta, de asemenea, la îmbunătățirea performanței de rulare a aplicațiilor dvs.

Exemplele din acest articol folosesc Soluția exemplu de urgență spitalicească răspuns.

Folosiți App.Formulas în loc de App.OnStart

Sfat

Puteți utiliza With funcția și planșă de lucru proprietățile de ieșire personalizate ale componentei ca alternativă la formulele numite.

Cea mai bună modalitate de a reduce timpul de încărcare atât pentru Power Apps Studio cât și pentru aplicație este să înlocuiți inițializarea variabilelor și a colecțiilor în App.OnStart cu formule denumite în App.Formulas.

Să ne uităm la următorul exemplu, care utilizează 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
    );
);

Deoarece sunt o secvență de declarații, aplicația dvs. trebuie să evalueze aceste apeluri Setați și Colectați în ordine înainte de aceasta. poate afișa primul ecran, ceea ce face ca aplicația să se încarce mai lent. Și pentru că întregul App.OnStart trebuie considerat ca un întreg, ordinea păstrată și erorile agregate înainte de a returna rezultatul final, formula este complexă pentru Power Apps Studio a analiza.

Există o cale mai bună. Folosiți App.Formulas și definiți aceste variabile și colecții ca formule numite, ca în exemplul următor.

// 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()
    );

Această schimbare poate părea mică, dar poate avea un impact uriaș. Deoarece fiecare formulă numită este independentă de celelalte, Power Apps Studio le poate analiza independent, împărțind efectiv un App.OnStart în bucăți mai mici. Am observat că timpul de încărcare a scăzut cu până la 80% numai cu această modificare. Power Apps Studio

De asemenea, aplicația dvs. se încarcă mai repede, deoarece nu trebuie să evalueze aceste formule până când nu are nevoie de rezultat. Primul ecran al aplicației este afișat imediat.

Formulele denumite nu pot fi folosite în toate situațiile, deoarece nu le puteți modifica sau folosi cu Setare. Unele situații necesită utilizarea unei variabile de stare care poate fi modificată. Set este perfect pentru aceste situații și ar trebui să îl utilizați în continuare. Dar, de cele mai multe ori, utilizați variabile globale în OnStart pentru a configura valori statice care să nu se modifice. În aceste cazuri, o formulă numită este cea mai bună alegere.

Deoarece formulele numite sunt imuabile, prefixul var (prescurtare de la „variabilă”) ca convenție de denumire nu mai este adecvat. Nu am schimbat numele în acest exemplu, deoarece ar fi nevoie de modificări pentru restul aplicației pentru a se potrivi.

Este tentant să plasați o formulă numită în App.OnStart, dar nu o faceți. Ei nu aparțin acolo. Ca proprietate On comportament, App.OnStart evaluează fiecare dintre instrucțiunile sale în ordine, creând variabile globale și vorbind cu bazele de date o singură dată, când aplicația este încărcată. Formulele numite sunt formule care definesc cum se calculează ceva oricand este necesar și sunt întotdeauna adevărate. Această formulă le permite să fie independenți și permite aplicației să termine încărcarea înainte de a fi evaluate.

Împărțiți formulele lungi

App.OnStart este unul dintre cei mai grav delincvenți pentru formulele lungi și cu siguranță de unde ar trebui să începi, dar nu este singurul caz.

Studiile noastre au arătat că aproape toate aplicațiile cu un timp de încărcare lung pentru Power Apps Studio au cel puțin o formulă de peste 256.000 de caractere. Unele aplicații cu cei mai mari timpi de încărcare au formule de peste 1 milion de caractere. Formule care pun mult timp o presiune semnificativă asupra Power Apps Studio.

Pentru a înrăutăți lucrurile, copierea și lipirea unui control cu ​​o formulă lungă dublează formula în proprietățile controlului fără ca aceasta să fie realizată. Power Apps este modelat după Excel, unde mai multe copii ale unei formule sunt comune. Cu toate acestea, în Excel formulele sunt limitate la o singură expresie și sunt limitate la 8.000 de caractere. Power Apps formulele pot crește mult mai mult odată cu introducerea logicii imperative și a operatorului de înlănțuire (; sau ;;, în funcție de local).

Soluția generală este de a împărți formulele lungi în părți mai mici și de a reutiliza părțile, așa cum am făcut în secțiunea anterioară când am schimbat Set/Collect instrucțiuni în App.OnStart la formulele numite în App.Formules. În alte limbaje de programare, părțile reutilizabile sunt adesea denumite subrutine sau funcții definite de utilizator. Vă puteți gândi la formulele numite ca o formă simplă de funcție definită de utilizator, fără parametri sau efecte secundare.

Folosiți formule cu nume peste tot

În exemplul anterior, am folosit formule numite ca înlocuitor pentru App.OnStart. Cu toate acestea, le puteți folosi pentru a înlocui un calcul oriunde într-o aplicație.

De exemplu, unul dintre ecranele din soluția exemplu de urgență spitalicească răspuns include această logică în 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
    }
); 

Această formulă poate fi împărțită într-un set de formule numite. De asemenea, face formula mai ușor de citit.

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

Am extras ParamFacility ca o formulă numită mai devreme, când am mutat majoritatea apelurilor Set de la App.OnStart la formulele numite în App.Formulas.

Formulele numite sunt evaluate numai atunci când sunt necesare valorile lor. Dacă intenția inițială de a utiliza Screen.OnVisible a fost de a amâna lucrul până când ecranul este afișat, atunci lucrarea este încă amânată ca formule denumite globale în App.Formules.

Utilizați funcția Cu

De asemenea, puteți utiliza funcția Cu într-o formulă pentru a împărți logica. Creați o înregistrare în primul parametru cu valorile pe care doriți să le utilizați ca câmpuri, apoi utilizați acele câmpuri din al doilea parametru pentru a calcula valoarea returnată de la Cu. De exemplu, exemplul anterior poate fi scris ca o singură formulă numită:

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

Un dezavantaj al folosirii Cu în acest fel este că MyFacility nu se poate folosi MyRegion deoarece sunt definite în același mod Cu funcția, o problemă care nu este prezentă cu formulele numite. O soluție este să imbricați Cu funcții și să folosiți cuvântul cheie As pentru a denumi înregistrarea pentru fiecare pentru a oferi acces ușor la toate Cu variabilele.

Utilizați componentele planșă de lucru

Componentele planșă de lucru sunt cel mai adesea folosite pentru a crea un control UI care poate fi plasat pe planșă de lucru la fel ca un control. De asemenea, le puteți utiliza fără a le plasa în interfața de utilizare pentru a efectua calcule cu proprietăți de ieșire personalizate ca alternativă la formulele numite. Componentele planșă de lucru sunt ușor de partajat între aplicații cu biblioteci de componente și, spre deosebire de formulele numite, sunt pe deplin acceptate. Cu toate acestea, sunt mai greu de configurat și de utilizat decât formulele numite.

Pentru a împărți logica:

  1. În Power Apps Studio, comutați la fila Componente din Vizualizarea ierarhică.
  2. Crearea unei componente noi.
  3. În panoul Proprietăți, activați Accesați domeniul de aplicare al aplicației.
  4. Adăugați o proprietate personalizată.
  5. Setați Tipul de proprietate la Ieșire și Tipul de date după caz.
  6. Selectați Creați.
  7. În selectorul de proprietăți de lângă bara de formule din partea de sus a ecranului, selectați noua proprietate.
  8. Scrieți formula logicii de împărțire și reutilizare.

Pentru a folosi logica:

  1. Comutați la fila Ecrane din Afișare ierarhică.
  2. În panoul Inserare, extindeți Personalizat și introduceți componenta.
  3. Pentru a calcula o valoare cu proprietatea, utilizați ComponentName.PropertyName.

Utilizați Select cu un control ascuns pentru o logică imperativă

Logica imperativă este utilizată pentru a modifica starea cu Set și Collect, notificați utilizatorul cu Anunțați, navigați la alt ecran sau aplicație cu Navigați și Lansați și scrieți valori într-o bază de date cu Patch, SubmitForm sau RemoveIf.

Formulele denumite și proprietățile de ieșire personalizate ale componentei planșă de lucru nu acceptă logica imperativă. O modalitate obișnuită de a împărți logica imperativă este utilizarea OnSelect proprietatea unui control ascuns.

  1. Adăugați un control Button la un ecran.
  2. Setați proprietatea OnSelect la logica imperativă pe care doriți să o executați.
  3. Setați proprietatea Visible la false, deoarece nu este nevoie ca utilizatorul să o vadă sau să interacționeze cu aceasta.
  4. Apelați Select( Button ) când doriți să executați logica imperativă.

De exemplu, unul dintre ecranele din exemplul nostru are următoarea proprietate OnSelect pe un control Button . (Acest exemplu simplu are doar scop ilustrativ. În mod normal, ați folosi această tehnică numai pentru formule mai lungi.)

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

Pentru a împărți această logică în părți, putem pune porțiuni pe comenzi Button separate și le selectăm din original:

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

Această tehnică funcționează doar pe același ecran. Alte tehnici care sunt puțin mai complicate funcționează pe ecrane, cum ar fi utilizarea Toggle control, setarea OnCheck la logică doriți să rulați și setați Implicit la o variabilă globală și apoi comutați variabila globală cu Set( global, true ); Set( global, false ) în punctul în care doriți să rulați logica.

În acest exemplu, o divizare logică fusese deja făcută. Comentariul menționează că „Acțiunile ulterioare pot fi găsite în OnSuccess”. Acest eveniment rulează logica imperativă după ce înregistrarea a fost trimisă cu succes, o soluție specifică funcției SubmitForm .

Partiționați aplicația

Unele aplicații cresc la mii de comenzi și sute de surse de date, ceea ce încetinește Power Apps Studio. Ca și în cazul formulelor lungi, aplicațiile mari pot fi împărțite în secțiuni mai mici care lucrează împreună pentru a crea o experiență de utilizator.

Separați aplicațiile planșă de lucru

O abordare este să implementezi secțiuni în aplicații planșă de lucru separate și să folosești funcția Launch pentru a naviga între aplicațiile separate și a trece contextul necesar.

Această abordare a fost utilizată în Soluția de probă de urgență spitalicească răspuns. Aplicații separate gestionează fiecare dintre zonele majore ale aplicației generale. Aplicațiile au o componentă comună de centrală printr-un bibliotecă de componente pe care fiecare aplicație îl arată pe ecranul său de pornire:

Captură de ecran a urgenței spitalului răspuns Exemplu de soluție aplicație creată pe planșă care rulează pe un telefon, care arată componenta centrală planșă de lucru.

Când utilizatorul selectează o zonă, componenta folosește metadate despre aplicațiile disponibile și care aplicație găzduiește componenta. Dacă ecranul dorit se află în această aplicație (adică ThisItem.Screen nu este gol), atunci a Navigați se face apelul. Dar dacă ecranul dorit se află într-o altă aplicație (adică ThisItem.PowerAppID nu este gol), atunci a Lansare funcția este utilizată cu ID-ul aplicației țintei și contextul 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
    )
);

Starea din aplicația originală se pierde atunci când este lansată o altă aplicație. Asigurați-vă că salvați orice stare înainte de a apela funcția Lansare . Scrieți-l într-o bază de date, apelați SaveData sau transmiteți starea aplicației țintă cu parametrii care sunt citiți cu Param funcția.

Aplicație bazată pe model cu pagini personalizate

Secțiunile pot fi implementate și ca pagini personalizate. Paginile personalizate acționează ca un mini aplicație creată pe planșă cu un container de aplicații bazat pe model pentru navigare.

Notă

Ne puteți spune care preferințele dvs. lingvistice pentru documentație? Răspundeți la un chestionar scurt. (rețineți că acest chestionar este în limba engleză)

Chestionarul va dura aproximativ șapte minute. Nu sunt colectate date personale (angajament de respectare a confidențialității).