Vytvárajte veľké a zložité aplikácie na plátne

Väčšina článkov v tejto sekcii dokumentácie sa zaoberá výkonom aplikácií v režime runtime podľa skúseností ľudí, ktorí ich používajú. Tento článok sa zaoberá výkonnosťou aplikácií podľa skúseností ľudí, ktorí ich vytvárajú.

Keďže sa aplikácie zväčšujú a sú zložitejšie, Power Apps Studio treba načítať a spravovať väčšie množstvo ovládacích prvkov, vzorcov a zdrojov údajov, a to všetko so vzájomnými závislosťami, ktoré exponenciálne rastú. Power Apps Studio načítanie môže trvať dlhšie a funkcie ako IntelliSense a farebné kódovanie môžu zaostávať. Na lepšiu prácu s veľkými a zložitými aplikáciami použite nasledujúce odporúčania Power Apps Studio. Môžu tiež pomôcť zlepšiť výkon vašich aplikácií pri spustení.

Príklady v tomto článku používajú vzorové riešenie Nemocničnej núdzovej reakcie.

Namiesto App.OnStart použite App.Formulas

Tip

Vlastné výstupné vlastnosti komponentu funkcie a plátna môžete použiť S ako alternatívu k pomenovaným vzorcom.

Najlepší spôsob, ako skrátiť čas načítania pre Power Apps Studio a vašu aplikáciu, je nahradiť inicializáciu premennej a kolekcie v App.OnStart za pomenované vzorce v App.Formulas.

Pozrime sa na nasledujúci príklad, ktorý používa 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
    );
);

Keďže ide o sekvenciu príkazov, vaša aplikácia musí pred ňou vyhodnotiť tieto hovory Nastaviť a Zhromažďovať môže zobraziť prvú obrazovku, vďaka čomu sa aplikácia načítava pomalšie. A pretože celá App.OnStart musí byť považovaná za celok, poradie zachované a chyby agregované pred vrátením konečného výsledku, vzorec je zložitý pre Power Apps Studio analyzovať.

Existuje lepší spôsob. Namiesto toho použite App.Formulas a definujte tieto premenné a kolekcie ako pomenované vzorce, ako v nasledujúcom príklade.

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

Táto zmena sa môže zdať malá, no môže mať obrovský vplyv. Pretože každý pomenovaný vzorec je nezávislý od ostatných, Power Apps Studio môže ich analyzovať nezávisle a efektívne rozdeliť veľkú App.OnStart na menšie časti. Už len touto zmenou sme zaznamenali Power Apps Studio čas načítania až o 80 %.

Vaša aplikácia sa tiež načíta rýchlejšie, pretože tieto vzorce nemusí vyhodnocovať, kým nebude potrebovať výsledok. Okamžite sa zobrazí prvá obrazovka aplikácie.

Pomenované vzorce nie je možné použiť vo všetkých situáciách, pretože ich nemôžete upraviť ani použiť s Set. Niektoré situácie vyžadujú použitie stavovej premennej, ktorú možno upraviť. Set je ideálny pre tieto situácie a mali by ste ho naďalej používať. Častejšie však používate globálne premenné v OnStart na nastavenie statických hodnôt, ktoré sa nemenia. V týchto prípadoch je pomenovaný vzorec lepšou voľbou.

Keďže pomenované vzorce sú nemenné, predpona var (skratka pre „premenná“) ako konvencia pomenovania už nie je vhodná. Názvy v tomto príklade sme nezmenili, pretože by to vyžadovalo zmeny vo zvyšku aplikácie, aby sa zhodovali.

Je lákavé umiestniť pomenovaný vzorec do App.OnStart, ale nerobte to. Nepatria tam. Ako vlastnosť správania On App.OnStart vyhodnocuje každý zo svojich príkazov v poradí, vytvára globálne premenné a hovoriť s databázami iba raz, keď je aplikácia načítaná. Pomenované vzorce sú vzorce, ktoré definujú, ako niečo vypočítať v prípade potreby a sú vždy pravdivé. Práve táto povaha vzorca im umožňuje byť nezávislými a umožňuje aplikácii dokončiť načítanie skôr, ako budú vyhodnotené.

Rozdeľte dlhé vzorce

App.OnStart je jedným z najhorších previnilcov pre dlhé vzorce a určite tam, kde by ste mali začať, ale nie je to jediný prípad.

Naše štúdie ukázali, že takmer všetky aplikácie s dlhým časom načítania pre Power Apps Studio majú aspoň jeden vzorec s viac ako 256 000 znakmi. Niektoré aplikácie s najdlhším časom načítania majú vzorce s viac ako 1 miliónom znakov. Vzorce, ktoré dlhodobo výrazne zaťažujú Power Apps Studio.

Aby toho nebolo málo, kopírovanie a prilepenie ovládacieho prvku s dlhým vzorcom duplikuje vzorec vo vlastnostiach ovládacieho prvku bez toho, aby sa to realizovalo. Power Apps je modelovaný podľa Excelu, kde sú bežné viaceré kópie vzorca. V Exceli sú však vzorce obmedzené na jeden výraz a sú obmedzené na 8 000 znakov. Power Apps vzorce môžu rásť oveľa dlhšie so zavedením imperatívnej logiky a operátora reťazenia (; alebo ;;, v závislosti od lokality).

Všeobecným riešením je rozdeliť dlhé vzorce na menšie časti a znova ich použiť, ako sme to urobili v predchádzajúcej časti, keď sme zmenili príkazy Set/Zhromažďovať v App.OnStart na pomenované vzorce v App.Formulas. V iných programovacích jazykoch sa opakovane použiteľné časti často označujú ako podprogramy alebo používateľom definované funkcie. Pomenované vzorce si môžete predstaviť ako jednoduchú formu používateľom definovanej funkcie bez parametrov alebo vedľajších účinkov.

Všade používajte pomenované vzorce

V predchádzajúcom príklade sme použili pomenované vzorce ako náhradu za App.OnStart. Môžete ich však použiť na nahradenie výpočtu kdekoľvek v aplikácii.

Napríklad jedna z obrazoviek vo vzorovom riešení Hospital Emergency Response obsahuje túto logiku v 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
    }
); 

Tento vzorec je možné rozdeliť na množinu pomenovaných vzorcov. Tiež uľahčuje čítanie vzorca.

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 ako pomenovaný vzorec sme extrahovali skôr, keď sme presunuli väčšinu hovorov Set z App.OnStart na pomenované vzorce v App.Formulas.

Pomenované vzorce sa vyhodnocujú len vtedy, keď sú potrebné ich hodnoty. Ak pôvodným zámerom použitia Screen.OnVisible bolo odložiť prácu, kým sa nezobrazí obrazovka, potom sa práca stále odloží ako globálne pomenované vzorce v App.Formulas.

Použite funkciu S

Na rozdelenie logiky môžete vo vzorci použiť aj funkciu S . Vytvorte záznam v prvom parametri s hodnotami, ktoré chcete použiť ako polia, a potom použite tieto polia v druhom parametri na výpočet návratovej hodnoty z With. Napríklad predchádzajúci príklad možno napísať len ako jeden pomenovaný vzorec:

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

Jednou nevýhodou používania S týmto spôsobom je, že MyFacility nemôžete použiť MyRegion pretože sú definované rovnako S funkciou, problém, ktorý sa pri pomenovaných vzorcoch nevyskytuje. Jedným z riešení je vnorenie S funkciami a použitie kľúčového slova As na pomenovanie záznamu pre každú z nich, aby bol umožnený jednoduchý prístup na všetky S premennými.

Použite komponenty plátna

Komponenty plátna sa najčastejšie používajú na vytvorenie ovládacieho prvku používateľského rozhrania, ktorý možno umiestniť na plátno rovnako ako ovládací prvok. Môžete ich použiť aj bez toho, aby ste ich umiestnili do používateľského rozhrania na vykonávanie výpočtov s vlastnými výstupnými vlastnosťami ako alternatívu k pomenovaným vzorcom. Komponenty plátna sa dajú jednoducho zdieľať medzi aplikáciami pomocou knižníc komponentov a na rozdiel od pomenovaných vzorcov sú plne podporované. Je však ťažšie ich konfigurovať a používať ako pomenované vzorce.

Ak chcete rozdeliť logiku:

  1. V Power Apps Studio sa prepnite na kartu Komponenty v Stromové zobrazenie.
  2. Vytvorenie nového komponentu.
  3. Na table Vlastnosti zapnite Prístup k rozsahu aplikácie.
  4. Pridajte vlastnú vlastnosť.
  5. Nastavte Typ vlastníctva na Výstup a Typ údajov podľa potreby.
  6. Vyberte položku Vytvoriť.
  7. Vo výbere vlastnosti vedľa riadka vzorcov v hornej časti obrazovky vyberte novú vlastnosť.
  8. Napíšte vzorec logiky na rozdelenie a opätovné použitie.

Ak chcete použiť logiku:

  1. Prejdite na kartu Obrazovky v Stromové zobrazenie.
  2. Na table Vložiť rozbaľte Vlastné a vložte svoj komponent.
  3. Ak chcete vypočítať hodnotu s vlastnosťou, použite ComponentName.PropertyName.

Použite Select so skrytým ovládacím prvkom pre imperatívnu logiku

Imperatívna logika sa používa na úpravu stavu pomocou Nastaviť a Zhromažďovať, upozorniť používateľa pomocou Upozorniť, prejsť na inú obrazovku alebo aplikáciu pomocou Navigovať a Spustiť a zapisovať hodnoty do databázy pomocou Opravy, Odoslať formulár alebo OdstrániťIf.

Pomenované vzorce a vlastné výstupné vlastnosti komponentu plátna nepodporujú imperatívnu logiku. Bežným spôsobom, ako rozdeliť imperatívnu logiku, je použiť vlastnosť OnSelect skrytého ovládacieho prvku.

  1. Pridajte na obrazovku ovládací prvok Tlačidlo .
  2. Nastavte vlastnosť OnSelect na imperatívnu logiku, ktorú chcete vykonať.
  3. Vlastnosť Visible nastavte na hodnotu false, pretože používateľ ju nemusí vidieť ani s ňou interagovať.
  4. Zavolajte Select( Button ) , keď chcete vykonať imperatívnu logiku.

Napríklad jedna z obrazoviek v našej vzorke má nasledujúcu vlastnosť OnSelect v ovládacom prvku Button . (Tento jednoduchý príklad slúži len na ilustráciu. Za normálnych okolností by ste túto techniku ​​​​používali iba pre dlhšie vzorce.)

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

Aby sme túto logiku rozdelili na časti, môžeme časti umiestniť na samostatné ovládacie prvky tlačidla a Vybrať z originálu:

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

Táto technika funguje iba na tej istej obrazovke. Iné techniky, ktoré sú o niečo komplikovanejšie, fungujú na rôznych obrazovkách, ako je použitie ovládacieho prvku Toggle, nastavenie OnCheck na logiku ktorú chcete spustiť, a nastavením Predvolené na globálnu premennú a potom prepnutím globálnej premennej pomocou Set( global, true ); Set( global, false ) v bode, kde chcete spustiť logiku.

V tomto príklade už bolo urobené nejaké logické rozdelenie. V komentári sa uvádza, že "Následné akcie nájdete v OnSuccess." Táto udalosť sa spustí po úspešnom odoslaní záznamu, čo je riešenie špecifické pre funkciu SubmitForm .

Rozdeľte aplikáciu

Niektoré aplikácie rastú na tisíce ovládacích prvkov a stovky zdrojov údajov, čo spomaľuje Power Apps Studio. Rovnako ako v prípade dlhých vzorcov je možné veľké aplikácie rozdeliť na menšie časti, ktoré spolupracujú na vytvorení jedného používateľského prostredia.

Samostatné aplikácie na plátne

Jedným z prístupov je implementácia sekcií v samostatných aplikáciách plátna a použitie funkcie Spustiť na navigáciu medzi samostatnými aplikáciami a odovzdanie potrebného kontextu.

Tento prístup bol použitý v vzorovom riešení reakcie na núdzovú situáciu v nemocnici. Samostatné aplikácie spravujú každú z hlavných oblastí celkovej aplikácie. Aplikácie zdieľajú spoločný komponent ústredne prostredníctvom knižnice komponentov, ktorú každá aplikácia zobrazuje na svojej úvodnej obrazovke:

Snímka obrazovky plátna aplikácie Hospital Emergency Response Sample, ktorá beží na telefóne a zobrazuje komponent plátna ústredne.

Keď používateľ vyberie oblasť, komponent použije metadáta o dostupných aplikáciách a o tom, ktorá aplikácia je hostiteľom komponentu. Ak je požadovaná obrazovka v tejto aplikácii (t. j. Obrazovka TátoPoložka nie je prázdna), potom a Navigovať hovor sa uskutoční. Ak je však požadovaná obrazovka v inej aplikácii (t. j. ThisItem.PowerAppID nie je prázdne), potom a Spustiť funkcia sa používa s ID aplikácie cieľa a kontextom 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
    )
);

Stav v pôvodnej aplikácii sa stratí pri spustení inej aplikácie. Pred volaním funkcie Spustiť nezabudnite uložiť akýkoľvek stav. Zapíšte ho do databázy, zavolajte SaveData alebo odovzdajte stav cieľovej aplikácii s parametrami, ktoré sa čítajú pomocou Param funkcia.

Modelom riadená aplikácia s vlastnými stránkami

Sekcie môžu byť implementované aj ako vlastné stránky. Vlastné stránky fungujú ako miniaplikácia na plátne s modelom riadeným kontajnerom aplikácií na navigáciu.

Poznámka

Môžete nás informovať o svojich voľbách jazyka pre dokumentáciu? Absolvujte krátky prieskum. (upozorňujeme, že tento prieskum je v angličtine)

Prieskum bude trvať približne sedem minút. Nezhromažďujú sa žiadne osobné údaje (vyhlásenie o používaní osobných údajov).