Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Galeria jest jedyną kontrolką, która może tworzyć inne kontrolki. Ma swój własny zakres. Te zaawansowane funkcje mogą prowadzić do nieoczekiwanego zachowania, jeśli galeria nie jest poprawnie skonfigurowana. W tym artykule opisano najlepsze rozwiązania i zalecenia dotyczące pracy z galeriami.
Nie zmieniaj elementów galerii bezpośrednio w galerii
Łatwo jest stworzyć niestabilne zachowanie, jeśli OnChange lub OnSelect kontrolek podrzędnych modyfikuje elementy galerii nadrzędnej. Na przykład pole tekstowe w galerii może mieć właściwość OnChange ustawioną na:
Patch(GalleryData, ThisItem, {Name: TextInput.Text})
Zwykle jest to w porządku. Większość elementów sterujących będzie wyzwalana OnChange tylko wtedy, gdy użytkownicy bezpośrednio zmieniają ich wartości. Jednak te kontrolki mogą powodować problemy, ponieważ wyzwalają również OnChange, gdy system zmienia wartość :
gdy ComboBox.DefaultSelectedItems się zmienia, wyzwala OnChange. Rozważ Pole kombi w Galerii z DefaultSelectedItems ustawionym na First(ThisItem.A) i jego właściwość OnChange ustawioną na:
UpdateIf(GalleryData, Name = ThisItem.Name, {
A: Table({
B: First(Self.SelectedItems).B
})
})
To wyrażenie aktualizuje rekord w źródle danych galerii, który jest zgodny z nazwą bieżącego elementu. Zmiana polega na zastąpieniu A kolumny rekordu nową tabelą.
Powoduje to nieskończoną pętlę. Kiedy użytkownik zmienia wartość pole kombi, uruchamiane jest OnChange, które aktualizuje GalleryData, które zmienia DefaultSelectedItems (ponieważ First(ThisItem.A) odnosi się do nowej tabeli), które ponownie uruchamia OnChange, i tak dalej.
Aby uniknąć nieskończonych pętli, możesz użyć nowoczesnych kontrolek lub innych kontrolek , które nie są wyzwalane OnChange po zmianie ich danych.
Wolna wydajność z powodu poprawek elementów
Nawet jeśli unikasz niepożądanych pętli, poprawianie lub aktualizowanie elementów galerii może być powolne, jeśli galeria zawiera wiele elementów. Galeria nie tylko aktualizuje wiersze skojarzone ze zmienionymi rekordami. W niektórych przypadkach ponownie ładuje wszystkie elementy. Wynika to z luźno ustrukturyzowanego charakteru źródeł danych. Galeria może być trudna do ustalenia, czy tylko jeden rekord został zmieniony, czy całe źródło danych.
Gallery.Selected może ulec nieoczekiwanej zmianie
Właściwość Wybrano w Galerii jest ruchomym celem. Może ona ulec zmianie bez interakcji z użytkownikiem, gdy:
- Zmiany Gallery.Default
- Gallery.Items — zmiany
- Odświeżanie lub aktualizowanie źródeł danych
Może to nie być pożądane w twoim scenariuszu. Jeśli chcesz stabilną kopię elementu wybranego przez użytkownika, rozważ zapisanie go w zmiennej. Na przykład ustaw właściwość OnSelectgalerii na zmienną CurrentItemglobalną :
Set(CurrentItem, Self.Selected)
Następnie możesz użyć CurrentItem w innych częściach aplikacji, aby odwołać się do najnowszego elementu wybranego przez użytkownika, a nie przez system.
Nie używaj Gallery.Selected w zdarzeniu kontrolki podrzędnej
Właściwość Selectedgalerii zmienia się, gdy użytkownik wybierze element. Zdarzenie to nie jest jednak powiązane ze zdarzeniami kontrolek podrzędnych. Odwoływanie się do Gallery.Selected w zdarzeniach kontrolki podrzędnej może prowadzić do nieoczekiwanych rezultatów.
Na przykład gdy użytkownik wybierze pole wyboru w galerii, wystąpią następujące zdarzenia:
Checkbox.OnSelectCheckbox.OnCheck-
Gallery.Selectedprzechodzi do nowo klikniętego wiersza
Kolejność tych zdarzeń nie jest stała. Jest to problem, jeśli Checkbox.OnSelect jest ustawiony na:
Notify(Gallery.Selected.Name)
Gallery.Selected może nadal odwoływać się do wcześniej wybranego wiersza, gdy Checkbox.OnSelect jest wykonywany.
Aby uniknąć problemów z synchronizacją, nie używaj Gallery.Selected w zdarzeniach. Jeśli musisz, użyj polecenia Gallery.OnSelect , aby odpowiedzieć na zmiany w pliku Gallery.Selected.
Upewnij się, że galeria zna schemat swoich elementów
Ustawienie Gallery.Items zmiennej lub danych wyjściowych składnika kanwy może dać nieoczekiwane wyniki, w zależności od tego, kiedy zmienna jest ustawiona lub zmieniona.
Galerie muszą znać schemat elementów podczas ładowania aplikacji. Schemat, znany również jako kształt, to nazwa i typ kolumn w źródle danych. Rozważmy tę tabelę:
[{A: "abc", B: 123}, {A: "def", B: 456}]
Jego schemat składa się z kolumny A tekstowej i kolumny Bliczbowej .
W większości przypadków galeria może odgadnąć schemat elementów ze źródła danych i wyrażeń używanych w aplikacji. Jeśli jednak właściwość Items jest ustawiona na dane wyjściowe komponentu Canvas lub kontroli Import, Galeria nie może określić jej schematu. Tabela danych wyjściowych z tych kontrolek może być niedostępna, gdy aplikacja ładuje się, a schemat może nawet ulec zmianie. Galeria nie będzie renderować żadnych elementów, gdy nie zna schematu.
Ten sam problem może wystąpić, gdy pozycja Items jest ustawiona na zmienną, która nie jest inicjowana podczas ładowania aplikacji.
Jako obejście można wskazać oczekiwany schemat do Galerii za pomocą zmiennej. Ustaw App.OnStart na:
If(false, Set(GalleryData, [{A: "abc", B: 123}]), Set(GalleryData, []))
Dzięki temu system zna schemat GalleryData tabeli. Następnie możesz użyć GalleryData jako właściwości Itemsgalerii. W razie potrzeby zmień je na rzeczywiste źródło danych.
Nie zakładaj, że element AllItems zawiera wszystkie elementy zestawu danych
Właściwość AllItems to elementy, które są ładowane do widoku w galerii. To nie wszystkie elementy w Elementach. Element AllItems może ulec zmianie, gdy użytkownik przewija galerię, aby załadować więcej elementów. Zazwyczaj ta właściwość służy do pobierania wartości kontrolek podrzędnych, gdy użytkownik wchodzi z nimi w interakcję. W związku z tym na pewno został załadowany element AllItems i można w nim bezpiecznie odwoływać się do tego elementu. Nie należy odwoływać się do elementu w elemencie AllItems , jeśli nie masz pewności, czy użytkownik go widział.
Podobnie funkcja AllItemsCount to liczba elementów załadowanych do widoku w galerii. Nie jest to łączna liczba rekordów w obszarze Elementy. Aby uzyskać łączną liczbę rekordów w obszarze Elementy, użyj polecenia CountRows(<expression used for Items property>).