Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Der Katalog ist das einzige Steuerelement, das andere Steuerelemente erstellen kann. Sie hat einen eigenen Bereich. Diese erweiterten Features können zu unerwartetem Verhalten führen, wenn die Galerie nicht ordnungsgemäß konfiguriert ist. In diesem Artikel werden bewährte Methoden und Empfehlungen behandelt, wenn Sie mit Katalogen arbeiten.
Ändern Sie Galerieelemente nicht innerhalb der Galerie
Es kann leicht zu instabilem Verhalten kommen, wenn OnChange oder OnSelect untergeordneter Steuerelemente die Elemente des übergeordneten Katalogs ändern. Beispielsweise kann bei einer Texteingabe in einem Katalog die OnChange-Eigenschaft festgelegt sein auf:
Patch(GalleryData, ThisItem, {Name: TextInput.Text})
Dies ist in der Regel in Ordnung. Die meisten Steuerelemente werden nur ausgelöst OnChange , wenn Benutzer ihren Wert direkt ändern. Diese Steuerelemente können jedoch Probleme verursachen, da sie auch OnChange auslösen, wenn das System ihren Wert ändert:
Beispielsweise, wenn Änderungen an ComboBox.DefaultSelectedItems vorgenommen werden, wird OnChange ausgelöst. Betrachten Sie ein Kombinationsfeld in einer Galerie, dessen DefaultSelectedItems auf First(ThisItem.A) gesetzt ist und dessen OnChange-Eigenschaft wie folgt festgelegt ist:
UpdateIf(GalleryData, Name = ThisItem.Name, {
A: Table({
B: First(Self.SelectedItems).B
})
})
Dieser Ausdruck aktualisiert einen Datensatz in der Datenquelle des Katalogs, der dem Namen des aktuellen Elements entspricht. Die Änderung besteht darin, die A Spalte des Datensatzes durch eine neue Tabelle zu ersetzen.
Dies führt zu einer endlosen Schleife. Wenn der Benutzer den Wert des Kombinationsfelds ändert, wird OnChange ausgelöst, was GalleryData aktualisiert, was DefaultSelectedItems ändert (da First(ThisItem.A) sich auf eine neue Tabelle bezieht), was OnChange erneut auslöst, und so weiter.
Um endlose Schleifen zu vermeiden, können Sie moderne Steuerelemente oder andere Steuerelemente verwenden, die nicht OnChange auslösen, wenn sich ihre Daten ändern.
Langsame Leistung beim Patchen von Elementen
Selbst wenn Sie unerwünschte Schleifen vermeiden, kann das Patchen oder Aktualisieren von Katalogelementen langsam sein, wenn der Katalog viele Elemente enthält. Der Gallery aktualisiert nicht nur die Zeilen, die mit den geänderten Datensätzen verbunden sind. In einigen Fällen lädt sie alle Elemente neu. Dies liegt an der lose strukturierten Art von Datenquellen. Für die Galerie kann es schwierig sein zu wissen, ob nur ein einzelner Datensatz geändert wurde oder ob die gesamte Datenquelle geändert wurde.
Gallery.Selected kann unerwartet geändert werden
Die Selected-Eigenschaft des Katalogs ist ein bewegliches Ziel. Sie kann sich ohne Benutzerinteraktion ändern, wenn:
- Gallery.Default changes
- Gallery.Items-Änderungen
- Datenquellen aktualisieren
Dies ist für Ihr Szenario möglicherweise nicht wünschenswert. Wenn Sie eine stabile Kopie des Elements wünschen, das vom Benutzer ausgewählt wird, sollten Sie es in einer Variablen speichern. Legen Sie beispielsweise die OnSelect-Eigenschaft des Katalogs auf eine globale Variable CurrentItemfest:
Set(CurrentItem, Self.Selected)
Sie können dann CurrentItem in anderen Teilen der App verwenden, um auf das zuletzt vom Benutzer ausgewählte Element und nicht auf das System zu verweisen.
Verwenden Sie "Gallery.Selected" nicht im Ereignis eines untergeordneten Steuerelements.
Die Ausgewählte Eigenschaft des Katalogs ändert sich, wenn ein Benutzer ein Element auswählt. Dieses Ereignis steht jedoch nicht im Zusammenhang mit Ereignissen untergeordneter Steuerelemente. Der Verweis auf Gallery.Selected in den Ereignissen eines untergeordneten Steuerelements kann zu unerwarteten Ergebnissen führen.
Wenn ein Benutzer beispielsweise ein Kontrollkästchen in einem Katalogauswählt, treten die folgenden Ereignisse auf:
Checkbox.OnSelectCheckbox.OnCheck-
Gallery.SelectedÄnderungen an der neu geklickten Zeile
Die Reihenfolge dieser Ereignisse ist nicht festgelegt. Dies ist ein Problem, wenn Checkbox.OnSelect eingestellt ist.
Notify(Gallery.Selected.Name)
Gallery.Selected könnte sich weiterhin auf die zuvor ausgewählte Reihe beziehen, wenn Checkbox.OnSelect ausgeführt wird.
Um Timing-Probleme zu vermeiden, verwenden Sie Gallery.Selected nicht in Ereignissen. Wenn Sie müssen, verwenden Sie Gallery.OnSelect, um auf Änderungen von Gallery.Selected zu reagieren.
Stellen Sie sicher, dass die Galerie das Schema ihrer Elemente kennt
Die Einstellung Gallery.Items auf eine Variable oder Ausgabe einer Canvas-Komponente kann unerwartete Ergebnisse liefern, je nachdem, wann die Variable festgelegt oder geändert wird.
Kataloge müssen das Schema der zugehörigen Elemente kennen, wenn die App geladen wird. Ein Schema, auch als Shape bezeichnet, ist der Name und typ der Spalten in einer Datenquelle. Betrachten Sie diese Tabelle:
[{A: "abc", B: 123}, {A: "def", B: 456}]
Das Schema besteht aus einer Textspalte A und einer Zahlenspalte B.
Meistens kann die Galerie das Schema ihrer Elemente aus der Datenquelle und den Ausdrücken, die in der App verwendet werden, erraten. Wenn die Items-Eigenschaft jedoch auf das Ergebnis einer Canvas-Komponente oder eines Importsteuerelements festgelegt ist, kann die Galerie ihr Schema nicht bestimmen. Die Ausgabetabelle dieser Steuerelemente ist möglicherweise nicht verfügbar, wenn die App geladen wird und sich das Schema sogar ändert. Die Galerie rendert keine Elemente, wenn sie ihr Schema nicht kennt.
Das gleiche Problem kann auftreten, wenn Elemente auf eine Variable festgelegt sind, die beim Laden der App nicht initialisiert wird.
Um dieses Problem zu umgehen, können Sie dem Katalog mit einer Variablen einen Hinweis auf das erwartete Schema geben. Legen Sie "App.OnStart " auf Folgendes fest:
If(false, Set(GalleryData, [{A: "abc", B: 123}]), Set(GalleryData, []))
Auf diese Weise kann das System das Schema der GalleryData Tabelle kennen. Anschließend können Sie GalleryData als Elemente-Eigenschaft der Galerie verwenden. Ändern Sie sie bei Bedarf auf die tatsächliche Datenquelle.
Gehen Sie nicht davon aus, dass AllItems alle Elemente des Datasets enthält.
Die Eigenschaft AllItems umfasst die Elemente, die in einer Galerie zur Ansicht geladen werden. Es sind nicht alle Artikel in Artikel enthalten. AllItems können sich ändern, wenn der Benutzer im Katalog scrollt, um weitere Elemente zu laden. Normalerweise wird diese Eigenschaft verwendet, um Werte von untergeordneten Steuerelementen abzurufen, wenn der Benutzer mit ihnen interagiert. Daher wird bei AllItems garantiert, dass dieses Element geladen wurde und es sicher ist, darauf zu verweisen. Verweisen Sie nicht auf ein Element in AllItems , wenn Sie nicht sicher sind, ob der Benutzer es gesehen hat.
Ebenso ist AllItemsCount die Anzahl der Elemente, die in die Galerieansicht geladen werden. Dies ist nicht die Gesamtanzahl der Datensätze in "Items". Verwenden Sie CountRows(<expression used for Items property>), um die Gesamtdatensätze in Items abzurufen.