Oprette store og komplekse lærredapps
De fleste artikler i dette afsnit af dokumentationen dækker kørselsydeevnen for apps, som brugerne oplever. Denne artikel omhandler appens ydeevne, som den opleves af de personer, der opretter dem.
Efterhånden som apps bliver store og komplekse, skal Power Apps Studio indlæse og administrere et stort antal kontrolelementer, formler og datakilder med afhængighed, der vokser eksponentielt. Power Apps Studio kan tage længere tid at indlæse, og funktioner som IntelliSense og farvekodning kan tage lang tid. Brug gølgende anbefalinger til bedre at arbejde med store og komplekse apps i Power Apps Studio. De kan også være med til at forbedre ydeevnen i dine apps under kørsel.
Eksemplerne i denne artikel er baseret på Hospitalsnødberedskab – eksempelløsning.
Brug App.Formulas i stedet for App.OnStart
Tip
Du kan bruge Med funktion og lærredskomponentens brugerdefinerede outputegenskaber som et alternativ til navngivne formler.
Den bedste måde at mindske indlæsningstiden på for både Power Apps Studio og din app er at erstatte variabel- og indsamlingsinitialisering i App.OnStart med navngivne formler i App.Formulas.
Lad os se på følgende eksempel, der bruger 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
);
);
Da de er en række sætninger, skal din app evaluere disse Set- og Collect-kald i rækkefølge, før det første skærmbillede vises, hvilket sinker indlæsningstiden for appen. Og da hele App.OnStart skal opfattes som en helhed, ordren bevares og fejl aggregeres, før det endelige resultat returneres, er formlen for kompleks for Power Apps Studio at analysere.
Der er en bedre måde. Brug App.Formulas i stedet for, og definer disse variabler og samlinger som navngivne formler, som i dette eksempel.
// 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()
);
Denne ændring kan virke lille, men den kan have indflydelse på miljøet. Da hver navngivet formel er uafhængig af de andre, kan Power Apps Studio analysere dem uafhængigt og effektivt opdele en stor App.OnStart i mindre stykker. Vi har set et fald i Power Apps Studio-indlæsningstid på helt op til 80 % alene med denne ændring.
Appen indlæses også hurtigere, da den ikke behøver at vurdere disse formler, før der er brug for resultatet. Det første skærmbillede i appen vises med det samme.
Navngivne formler kan ikke bruges i alle situationer, fordi du ikke kan ændre dem eller bruge dem sammen med Set. I visse situationer kræves det, at der bruges en tilstandsvariabel, som kan ændres. Set er velegnet til disse situationer, og du bør fortsætte med at bruge den. Men oftest bruger du globale variabler i OnStart til at konfigurere statiske værdier, der ikke ændres. I disse tilfælde er en navngivet formel det bedste valg.
Da navngivne formler er uforanderlige, er præfikset var
(kort for "variabel") som en navngivningskonvention ikke længere passende. Vi har ikke ændret navnene i dette eksempel, da det ville kræve ændringer af resten af appen, så de stemmer overens.
Det er fristende at placere en navngivet formel i App.OnStart, men gør det ikke. De hører ikke til der. Som en On-funktionsmådeegenskab evaluerer App.OnStart de enkelte sætninger i rækkefølge, opretter globale variabler og taler med databaser kun én gang, når appen indlæses. Navngivne formler er i stedet formler, der definerer, hvordan noget skal beregnes, når det er nødvendigt , og de er altid sande. Det er denne formel, der gør det muligt for dem at være uafhængige og giver appen mulighed for at fuldføre indlæsningen, før de evalueres.
Opdeling af lange formler
App.OnStart er en af de værst tænkelige steder med lange formler og bestemt et sted, hvor du skal starte, men det er ikke det eneste tilfælde.
Vores undersøgelser har vist, at næsten alle apps med lang Power Apps Studio-indlæsningstid har mindst én formel på mere end 256.000 tegn. Nogle apps med de længste indlæsningstider har formler på mere end 1 million tegn. Formler, der længe har været en betydelig belastning i Power Apps Studio.
Endnu værre, når du kopierer og indsætter et kontrolelement med en lang formel, duplikeres formlen i kontrolelementets egenskaber, uden at det bliver klart. Power Apps er modelleret efter Excel, hvor flere kopier af en formel er almindeligt. I Excel er formler dog begrænset til ét udtryk, og de afkortes ved 8.000 tegn. Power Apps-formler kan vokse meget længere med introduktionen af den imperative logik og sammenkædningsoperator (;
eller ;;
afhængigt af landestandard).
Den generelle løsning er at opdele lange formler i mindre dele og genbruge disse dele, som det blev gjort i den forrige sektion, hvor vi ændrede sætningerne Set/Collect i App.OnStart til navngivne formler i App.Formulas. I andre programmeringssprog omtales genbrugsdele ofte som underrutiner eller brugerdefinerede funktioner. Navngivne formler kan beskrives som en simpel form for brugerdefinerede funktioner uden parametre eller sideeffekter.
Brug navngivne formler overalt
I det tidligere eksempel brugte vi navngivne formler som en erstatning for App.OnStart. Men du kan bruge dem til at erstatte en beregning alle steder i en app.
Et af skærmene i eksempelløsningen Hospitalsnødberedskab indeholder f.eks. denne logik i 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
}
);
Denne formel kan opdeles i et sæt navngivne formler. Det gør også formlen nemmere at læse.
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
};
ParamFacility blev pakket ud som en navngivet formel tidligere, da vi flyttede de fleste Set-opkald fra App.OnStart til navngivne formler i App.Formulas.
Navngivne formler evalueres kun, når der er behov for deres værdier. Hvis det oprindelige formål med at bruge Screen.OnVisible var at udskyde arbejdet, til skærmen blev vist, vil arbejdet stadig blive udskudt som globale navngivne formler i App.Formulas.
Brug With-funktionen
Du kan også bruge funktionen With i en formel til at opdele logikken. Opret en post i den første parameter med de ønskede værdier som felter og derefter bruge disse felter i den anden parameter til at beregne returværdien fra With. Ovenstående eksempel kan f.eks. skrives som en navngivet formel:
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
}
)
En ulempe ved at bruge With på denne måde er, at MyFacility
ikke kan bruge MyRegion
, fordi de er defineret i den samme With-funktion, som er et problem, der ikke opstår med navngivne formler. En løsning er at indlejre With-funktioner og bruge As-nøgleordet til at navngive posten for hver enkelt for at give nem adgang til alle With-variablerne.
Bruge lærredkomponenter
Lærredkomponenter bruges oftest til at oprette et UI-kontrolelement, der kan placeres på lærredet ligesom et kontrolelement. De kan også bruges uden at placere dem i brugergrænseflade til at udføre beregninger, hvor brugerdefinerede outputegenskaber er et alternativ til navngivne formler. Det er nemt at dele lærredkomponenter på tværs af apps med komponentbiblioteker, og modsat navngivne formler understøttes de fuldt ud. Det er dog sværere at konfigurere og bruge dem end navngivne formler.
At opdele logik:
- Skift i Power Apps Studio til fanen Komponenter i Trævisning.
- Opret en ny komponent.
- Aktiver adgangsappens omfang i ruden Egenskaber.
- Tilføj brugerdefineret egenskab.
- Angiv egenskabstypen til Output og Datatype efter behov.
- Vælg Opret.
- Vælg den nye egenskab i egenskabsvælgeren ud for formellinjen øverst på skærmen.
- Skriv formlen for logikken, så den kan opdeles og genbruges.
Sådan bruger du logikken:
- Skift fanen Skærmbilleder i Trævisning.
- Udvid Brugerdefineret i ruden Indsæt, og indsæt komponenten.
- Hvis du vil beregne en værdi sammen med egenskaben, skal du bruge ComponentName.PropertyName.
Brug Vælg med et skjult kontrolelement for vigtig logik
Vigtig logik bruges til at ændre tilstanden med Set og Collect, giv brugeren besked med Notify, naviger til et andet skærmbillede eller en anden app med Naviger og Start, og skriv værdier til en database med Patch, SubmitForm eller RemoveIf.
Navngivne formler og brugerdefinerede outputegenskaber på lærredkomponent understøtter ikke den nødvendige logik. En almindelig opdeling af den nødvendige logik er at bruge egenskaben OnSelect for et skjult kontrolelement.
- Føj et Knap-kontrolelement til et skærmbillede.
- Angiv egenskaben OnSelect til den tvingende logik, du vil udføre.
- Indstil egenskaben Visible til false, da brugeren ikke behøver at se eller arbejde med den.
- Ring
Select( Button )
, når du vil udføre den tvingende logik.
På et af skærmbillederne i eksemplet findes f.eks. egenskaben OnSelect på kontrolelementet Knap . (Dette simple eksempel er kun til illustrationsformål. Normalt bruger du kun denne teknik til længere formler.)
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)
);
Hvis du vil opdele denne logik i dele, kan vi placere dele på separate Knap-kontrolelementer og vælge dem fra originalen:
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 );
Denne teknik fungerer kun på samme skærm. Andre teknikker, der er en lidt mere kompliceret proces på tværs af skærmbilleder, f.eks. brug af kontrolelementet Til/fra-knap, angivelse af OnCheck til den logik, du vil køre, og angivelse af Default til en global variabel og derefter skifte den globale variabel Set( global, true ); Set( global, false )
på det tidspunkt, hvor du vil køre logikken.
I dette eksempel er der allerede sket en opdeling af logik. Kommentaren fortæller, at "Efterfølgende handlinger findes i OnSuccess". Denne hændelse kører en vigtig logik, når posten er sendt, en løsning, der er specifik for funktionen SubmitForm.
Partition-app
Nogle apps vokser til tusindvis af kontrolelementer og hundredvis af datakilder, hvilket sinker Power Apps Studio. Som med lange formler kan store apps opdeles i mindre sektioner, der arbejder sammen for at skabe én brugeroplevelse.
Separate lærredapps
Den ene fremgangsmåde er at implementere sektioner i separate lærredapps og bruge funktionen Launch til at navigere mellem de separate apps og overføre den nødvendige kontekst.
Denne fremgangsmåde blev brugt i Hospitalsnødberedskab – eksempelløsning Separate apps administrerer de vigtigste områder i den overordnede app. Appsene deler en fælles kontaktkomponent via et komponentbibliotek, som hver app viser på startskærmbilledet:
Når brugeren vælger et område, bruger komponenten metadata om de tilgængelige apps, og hvilken app der er vært for komponenten. Hvis den ønskede skærm er i denne app (dvs. ThisItem.Screen er ikke tom), foretages der et navigationsopkald. Men hvis den ønskede skærm er i en anden app (dvs. ThisItem.PowerAppID er ikke tom), bruges funktionen Launch med app-id for destinationen og FacilityID-konteksten:
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
)
);
Tilstanden i den oprindelige app går tabt, når en anden app startes. Sørg for at gemme en tilstand, før du kalder funktionen Launch . Skriv det til en database, kald SaveData, eller overfør tilstanden til målappen med parametre, der læses med funktionen Param.
Modelbaseret app med brugerdefinerede sider
Sektioner kan også implementeres som brugerdefinerede sider. Brugerdefinerede sider fungerer som en minilærredsapp med en modelbaseret appbeholder til navigation.
Bemærk
Kan du fortælle os om dine sprogpræferencer for dokumentation? Tag en kort undersøgelse. (bemærk, at denne undersøgelse er på engelsk)
Undersøgelsen tager ca. syv minutter. Der indsamles ingen personlige data (erklæring om beskyttelse af personlige oplysninger).