Große und komplexe Canvas-Apps erstellen
Die meisten Artikel in diesem Abschnitt der Dokumentation befassen sich mit der Laufzeitleistung von Anwendungen, wie sie von den Benutzern erlebt wird. Dieser Artikel behandelt die App-Performance, wie sie von den Personen erlebt wird, die sie erstellen.
Da Anwendungen immer größer und komplexer werden, muss Power Apps Studio eine größere Anzahl von Steuerelementen, Formeln und Datenquellen laden und verwalten, deren Abhängigkeiten exponentiell wachsen. Die App-Ladezeit für Power Apps Studio kann sich verlangsamen und bei Funktionen wie IntelliSense und Farbcodierung kann es zu Verzögerungen kommen. Verwenden Sie die folgenden Empfehlungen, um besser mit großen und komplexen Apps in Power Apps Studio zu arbeiten. Sie können auch dazu beitragen, die Laufzeitleistung Ihrer Apps zu verbessern.
Die Beispiele in diesem Artikel verwenden die Notfalleinsatz im Krankenhaus – Beispiellösung.
App.Formulas anstelle von App.OnStart verwenden
Tipp
Als Alternative zu benannten Formeln können Sie benutzerdefinierte Ausgabeeigenschaften von With-Funktionen und Canvas-Komponenten verwenden.
Die beste Möglichkeit, die Ladezeit sowohl für Power Apps Studio als auch für Ihre Anwendung zu verkürzen, besteht darin, die Initialisierung von Variablen und Sammlungen in App.OnStart mit benannten Formeln in App.Formulas zu ersetzen.
Schauen wir uns das folgende Beispiel an, das App.OnStart verwendet.
// 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 es sich um eine Folge von Anweisungen handelt, muss Ihre App diese Festlegen- und Erfassen-Aufrufe der Reihe nach auswerten, bevor sie den ersten Bildschirm anzeigen kann, wodurch die App langsamer lädt. Und da die gesamte App.OnStart als Ganzes betrachtet, die Reihenfolge beibehalten und Fehler zusammengefasst werden müssen, bevor das Endergebnis zurückgegeben wird, ist die Formel für Power Apps Studio komplex zu analysieren.
Es gibt eine bessere Möglichkeit dies zu erledigen. Verwenden Sie stattdessen App.Formulas und legen Sie diese Variablen und Sammlungen als benannte Formeln fest, wie im folgenden Beispiel.
// 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()
);
Diese Änderung mag klein erscheinen, kann aber kann eine große Wirkung haben. Da jede benannte Formel unabhängig von den anderen ist, kann Power Apps Studio sie unabhängig analysieren und effektiv eine große App.OnStart in kleinere Stücke aufteilen. Wir haben festgestellt, dass die Ladezeit von Power Apps Studio allein durch diese Änderung um bis zu 80 % gesunken ist.
Ihre App wird auch schneller geladen, da sie diese Formeln nicht auswerten muss, bis sie das Ergebnis benötigt. Der erste Bildschirm der App wird sofort angezeigt.
Benannte Formeln können nicht in allen Situationen verwendet werden, da Sie sie nicht mit Festlegen ändern oder verwenden können. Einige Situationen erfordern die Verwendung einer Zustandsvariablen, die modifiziert werden kann. Festlegen ist perfekt für diese Situationen und Sie sollten es weiterhin verwenden. Meistens verwenden Sie jedoch globale Variablen in OnStart, um statische Werte einzurichten, die sich nicht ändern. In diesen Fällen ist eine benannte Formel die bessere Wahl.
Da benannte Formeln unveränderlich sind, ist das Präfix var
(kurz für „Variable“) als Namenskonvention nicht mehr zeitgemäß. Wir haben die Namen in diesem Beispiel nicht geändert, da Änderungen am Rest der App erforderlich wären, um sie anzupassen.
Es ist verlockend, eine benannte Formel in App.OnStart zu platzieren, aber Sie sollten dies nicht tun. Sie gehören nicht dorthin. Als Ein-Verhaltenseigenschaft wertet App.OnStart jede seiner Anweisungen der Reihe nach aus, erstellt globale Variablen und Kommunikation mit Datenbanken nur einmal beim Laden der App. Benannte Formeln sind immer wahr und definieren, wie etwas bei Bedarf zu berechnen ist. Diese Natur der Formeln ermöglicht es ihnen, unabhängig zu sein, und ermöglicht der App, den Ladevorgang abzuschließen, bevor sie ausgewertet werden.
Lange Formeln aufteilen
App.OnStart ist einer der schlimmsten Übeltäter bei langen Formeln. Sie sind definitiv ein guter Ausgangspunkt, aber lange nicht der einzige Fall.
Unsere Recherchen haben gezeigt, dass fast alle Apps mit einer langen Power Apps Studio-Ladezeit mindestens eine Formel mit mehr als 256.000 Zeichen haben. Manche Apps mit den längsten Ladezeiten haben Formeln mit über einer Million Zeichen. Formeln, die Power Apps Studio lange stark belasten.
Erschwerend kommt hinzu, dass das Kopieren und Einfügen eines Steuerelements mit einer langen Formel die Formel in den Eigenschaften des Steuerelements dupliziert, ohne dass dies bemerkt wird. Power Apps ist Excel nachempfunden, wo mehrere Kopien einer Formel üblich sind. In Excel sind Formeln jedoch auf einen Ausdruck beschränkt und auf 8.000 Zeichen begrenzt. Power Apps-Formeln können mit der Einführung der imperativen Logik und des Verkettungsoperators (je nach Gebietsschema ;
oder ;;
) viel länger werden.
Die allgemeine Lösung besteht darin, lange Formeln in kleinere Teile aufzuteilen und die Teile wiederzuverwenden, wie wir es im vorigen Abschnitt getan haben, als wir Festlegen/Erfassen-Anweisungen in App.OnStart in benannte Formeln in App.Formulas umgewandelt haben. In anderen Programmiersprachen werden wiederverwendbare Teile oft als Unterroutinen oder benutzerdefinierte Funktionen bezeichnet. Sie können sich benannte Formeln als eine einfache Form einer benutzerdefinierten Funktion ohne Parameter oder Nebeneffekte vorstellen.
Benannte Formeln überall verwenden
Im vorherigen Beispiel haben wir benannte Formeln als Ersatz für App.OnStart verwendet. Sie können sie jedoch verwenden, um eine Berechnung überall in einer App zu ersetzen.
Beispielsweise enthält einer der Bildschirme in der Beispiellösung Hospital Emergency Response diese Logik 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
}
);
Diese Formel kann in einen Satz benannter Formeln aufgeteilt werden. Es erleichtert auch das Lesen der Formel.
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 wurde vorher als benannte Formel extrahiert, als wir die meisten Set-Aufrufe aus App.OnStart in benannte Formeln in App.Formulas umgestellt haben.
Benannte Formeln werden nur ausgewertet, wenn ihre Werte benötigt werden. Wenn Screen.OnVisible ursprünglich verwendet wurde, um Arbeit zurückzustellen, bis der Bildschirm angezeigt wird, wird die Arbeit als globale benannte Formeln in App.Formulas immer noch zurückgestellt.
Die „With“-Funktion verwenden
Sie können auch die Funktion With in einer Formel verwenden, um die Logik aufzuteilen. Erstellen Sie im ersten Parameter einen Datensatz mit den Werten, die Sie als Felder verwenden möchten, und verwenden Sie diese Felder dann im zweiten Parameter, um den Rückgabewert von With zu berechnen. Das vorherige Beispiel kann beispielsweise als nur eine benannte Formel geschrieben werden:
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
}
)
Ein Nachteil der Verwendung von With auf diese Weise ist, dass MyFacility
nicht MyRegion
verwenden kann, da sie in derselben With-Funktion definiert sind, ein Problem, das bei benannten Formeln nicht besteht. Eine Lösung besteht darin, With-Funktionen zu verschachteln und das As-Schlüsselwort zu verwenden, um den Datensatz für jeden einzelnen zu benennen, um einen einfachen Zugriff auf alle With-Variablen zu ermöglichen.
Canvas-Komponenten verwenden
Canvas-Komponenten werden am häufigsten verwendet, um ein UI-Steuerelement zu erstellen, das auf der Canvas wie ein Steuerelement platziert werden kann. Sie können sie auch verwenden, ohne sie in der Benutzeroberfläche zu platzieren, um Berechnungen mit benutzerdefinierten Ausgabeeigenschaften als Alternative zu benannten Formeln durchzuführen. Canvas-Komponenten lassen sich mit Komponentenbibliotheken leicht applikationsübergreifend nutzen und werden, anders als benannte Formeln, vollständig unterstützt. Sie sind jedoch schwieriger zu konfigurieren und zu verwenden als benannte Formeln.
Gehen Sie wie folgt vor, um die Logik aufzuteilen:
- Wechseln Sie in Power Apps Studio zur Registerkarte Komponenten aus der Strukturansicht:
- Erstellen Sie eine neue Komponente.
- Aktivieren Sie im Bereich Eigenschaften Auf Anwendungsbereich zugreifen.
- Fügen Sie eine benutzerdefinierte Eigenschaft hinzu.
- Legen Sie den Eigenschaftentyp auf Ausgabe und den Datentyp wie gewünscht fest.
- Wählen Sie Erstellen.
- Wählen Sie in der Eigenschaftsauswahl neben der Formelleiste am oberen Rand des Bildschirms die neue Eigenschaft aus.
- Schreiben Sie die Formel für die aufzuteilende und wiederzuverwendende Logik.
Gehen Sie wie folgt vor, um die Logik zu verwenden:
- Gehen Sie zur Registerkarte Bildschirme aus der Strukturansicht:
- Erweitern Sie im Bereich Einfügen Benutzerdefiniert und fügen Sie Ihre Komponente ein.
- Um einen Wert mit der Eigenschaft zu berechnen, verwenden Sie ComponentName.PropertyName.
„Auswählen“ mit einem ausgeblendeten Steuerelement für imperative Logik verwenden
Die imperative Logik wird verwendet, um den Status mit Set und Collect anzupassen, den Benutzer mit Notify zu benachrichtigen, mit Navigate und Launch zu einem anderen Bildschirm oder einer anderen App zu navigieren und Werte mit Patch, SubmitForm oder RemoveIf zu einer Datenbank zurückschreiben.
Benannte Formeln und benutzerdefinierte Ausgabeeigenschaften von Canvas-Komponenten unterstützen keine imperative Logik. Eine gängige Methode zum Aufteilen imperativer Logik besteht darin, die Eigenschaft OnSelect eines ausgeblendeten Steuerelements zu verwenden.
- Fügen Sie ein Schaltfläche-Steuerelement einem Bildschirm hinzu.
- Legen Sie die Eigenschaft OnSelect auf die imperative Logik fest, die Sie ausführen möchten.
- Legen Sie die Eigenschaft Visible auf „false“ fest, da der Benutzer sie nicht sehen oder damit interagieren muss.
- Rufen Sie
Select( Button )
auf, wenn Sie die imperative Logik ausführen möchten.
Beispielsweise hat einer der Bildschirme unseres Beispiels die folgende OnSelect-Eigenschaft auf einem Schaltfläche-Steuerelement. (Dieses einfache Beispiel dient nur zur Veranschaulichung. Normalerweise würden Sie diese Technik nur für längere Formeln verwenden.)
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)
);
Um diese Logik in Teile aufzuteilen, können wir Teile in separate Schaltfläche-Steuerelemente legen und sie aus dem Original auswählen:
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 );
Diese Technik funktioniert nur auf demselben Bildschirm. Andere Techniken, die etwas komplizierter sind, funktionieren bildschirmübergreifend, wie z. B. die Verwendung des Umschalter Steuerelements, das Setzen von OnCheck auf die Logik, die Sie ausführen möchten, und das Setzen von Default auf eine globale Variable und das Umschalten der globalen Variable mit Set( global, true ); Set( global, false )
an dem Punkt, an dem Sie die Logik ausführen möchten.
In diesem Beispiel wurde bereits eine Logikaufteilung durchgeführt. Der Kommentar erwähnt, dass „Nachfolgende Aktionen in OnSuccess gefunden werden können“. Dieses Ereignis führt imperative Logik aus, nachdem der Datensatz erfolgreich übermittelt wurde, eine Lösung, die für die SubmitForm-Funktion spezifisch ist.
Die App aufteilen
Einige Apps wachsen zu Tausenden von Steuerelementen und Hunderten von Datenquellen heran, wodurch Power Apps Studio langsamer wird. Wie bei langen Formeln können große Apps in kleinere Abschnitte aufgeteilt werden, die zusammenarbeiten, um ein Benutzererlebnis zu schaffen.
Canvas-Apps trennen
Ein Ansatz besteht darin, Abschnitte in separaten Canvas-Apps zu implementieren und die Funktion Launch zu verwenden, um zwischen den separaten Apps zu navigieren und den erforderlichen Kontext zu übergeben.
Dieser Ansatz wurde in der Notfalleinsatz im Krankenhaus – Beispiellösung verwendet. Separate Apps verwalten jeden der Hauptbereiche der gesamten App. Die Apps teilen sich eine gemeinsame Switchboard-Komponente über eine Komponentenbibliothek, die jede App auf ihrem Startbildschirm anzeigt:
Wenn der Benutzer einen Bereich auswählt, verwendet die Komponente Metadaten über die verfügbaren Apps und welche App die Komponente hostet. Wenn sich der gewünschte Bildschirm in dieser App befindet (d. h., ThisItem.Screen ist nicht leer), wird ein Navigate-Aufruf durchgeführt. Wenn sich der gewünschte Bildschirm jedoch in einer anderen App befindet (d. h., ThisItem.PowerAppID ist nicht leer), wird eine Launch-Funktion mit der App-ID des Ziels und dem FacilityID-Kontext verwendet:
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
)
);
Der Status der ursprünglichen Anwendung geht verloren, wenn eine andere Anwendung gestartet wird. Stellen Sie sicher, dass Sie alle Zustände speichern, bevor Sie die Funktion Launch aufrufen. Schreiben Sie sie in eine Datenbank, rufen Sie SaveData auf oder übergeben Sie den Status an die Zielanwendung mit Parametern, die mit der Funktion Param gelesen werden.
Modellgesteuerte Apps mit benutzerdefinierten Seiten
Abschnitte können auch als benutzerdefinierte Seiten implementiert werden. Benutzerdefinierte Seiten fungieren als Mini-Canvas-App mit einem modellgesteuerten App-Container für die Navigation.
Hinweis
Können Sie uns Ihre Präferenzen für die Dokumentationssprache mitteilen? Nehmen Sie an einer kurzen Umfrage teil. (Beachten Sie, dass diese Umfrage auf Englisch ist.)
Die Umfrage dauert etwa sieben Minuten. Es werden keine personenbezogenen Daten erhoben. (Datenschutzbestimmungen).