Bedste fremgangsmåder til brug af gallerikontrolelementet i lærredsapps

Galleriet er det eneste kontrolelement i lærredsapps, der kan oprette andre kontrolelementer. Det har sit eget omfang. Disse avancerede funktioner kan medføre en uventet funktionsmåde, når galleriet ikke er konfigureret korrekt. I denne artikel beskrives de bedste fremgangsmåder og anbefalinger, når du arbejder med gallery-kontrolelementer .

Tips

Overvej at bruge moderne kontrolelementer i dine gallerielementer, hvor det er muligt. Moderne kontrolelementer er designet til at minimere almindelige faldgruber som utilsigtede OnChange udløsere og give bedre tilgængelighed og stylingmuligheder. Du kan også bruge Copilot i Power Apps til automatisk at oprette et gallerilayout og en dataforbindelse.

Det er nemt at skabe en ustabil funktionsmåde, hvis OnChange eller OnSelect for underordnede kontrolelementer ændrer Elementer i det overordnede galleri. For eksempel kan Tekstinput i et galleri have egenskaben OnChange angivet til:

Patch(GalleryData, ThisItem, {Name: TextInput.Text})

Det er som regel helt fint. De fleste kontrolelementer udløses OnChange kun, når brugerne ændrer deres værdi direkte. Følgende kontrolelementer kan dog medføre problemer, fordi de også udløses OnChange , når systemet ændrer deres værdi:

Når ComboBox.DefaultSelectedItems ændres, udløser det f.eks. OnChange. Overvej et Kombinationsfelt i et Galleri, hvor DefaultSelectedItems er angivet til First(ThisItem.A), og egenskaben OnChange er angivet til:

UpdateIf(GalleryData, Name = ThisItem.Name, {
    A: Table({
        B: First(Self.SelectedItems).B
    })
})

Dette udtryk opdaterer en post i galleriets datakilde, der svarer til det aktuelle elements navn, og erstatter kolonnen A med en ny tabel.

Dette forårsager en uendelig løkke. Når brugeren ændrer værdien i kombinationsfeltet , OnChange udløses, som opdaterer GalleryData, som ændres DefaultSelectedItems (fordi First(ThisItem.A) der refereres til en ny tabel), som udløses OnChange igen – osv.

Hvis du vil undgå uendelige løkker, skal du bruge moderne kontrolelementer eller andre kontrolelementer, der ikke udløses OnChange , når deres data ændres.

Langsom ydeevne efter rettelse af elementer

Selvom du undgår uønskede løkker, kan det tage lang tid at reparere eller opdateregallerielementer , hvis galleriet indeholder mange elementer. Galleriet opdaterer ikke kun de rækker, der er knyttet til de ændrede poster – i nogle tilfælde genindlæses alle elementer. Dette sker på grund af datakildernes løst strukturerede karakter, hvilket gør det svært for galleriet at afgøre, om en enkelt post eller hele datakilden er ændret.

Gallery.Selected kan ændre sig uventet

Egenskaben Selected for Galleri er et bevægeligt mål. Den kan ændres uden brugerinteraktion, når et af følgende sker:

  • Gallery.Default ændres
  • Gallery.Items ændres
  • Datakilder opdateres eller ajourføres

Hvis du vil have en stabil kopi af det element, som brugeren har valgt, skal du gemme det i en variabel. Angiv f.eks. egenskaben OnSelect for galleriet til:

Set(CurrentItem, Self.Selected)

CurrentItem Brug derefter et andet sted i appen til at referere til det senest valgte element i stedet for den systemopdaterede egenskab Selected.

Brug ikke Gallery.Selected i en hændelse for et underordnet kontrolelement

Egenskaben Selected for Galleri ændres, når en bruger vælger et element. Denne hændelse er dog ikke synkroniseret med hændelser for underordnede kontrolelementer. Henvisning til Gallery.Selected i en hændelse for et underordnet kontrolelement kan føre til uventede resultater.

Når en bruger f.eks. vælger et afkrydsningsfelt i et galleri, sker følgende hændelser i en uspecificeret rækkefølge:

  • Checkbox.OnSelect
  • Checkbox.OnCheck
  • Gallery.Selected ændringer i den nyvalgte række

Da rækkefølgen af disse hændelser ikke er fast, kan brugen af Gallery.Selected i Checkbox.OnSelect stadig referere til den tidligere valgte række.

Hvis du vil undgå tidsindstillingsproblemer, skal du ikke bruge Gallery.Selected i hændelser for underordnede kontrolelementer. Hvis du skal svare på ændringer i Gallery.Selected, skal du bruge galleriets egen OnSelect hændelse.

Hvis du angiver Gallery.Items en variabel eller outputtet fra en lærredskomponent , kan det give uventede resultater, afhængigt af hvornår variablen er angivet eller ændret.

Gallerier skal kende skemaet for deres elementer , når appen indlæses. Et skema (også kaldet en figur) definerer navn og type af kolonner i en datakilde. Denne tabel kan f.eks. være:

[{A: "abc", B: 123}, {A: "def", B: 456}]

har et skema med en tekstkolonne A og en talkolonne B.

Galleriet kan for det meste udlede skemaet fra den datakilde og de udtryk, der bruges i appen. Men hvis egenskaben Items er angivet til outputtet for en lærredskomponent eller et importkontrolelement , kan galleriet ikke bestemme skemaet på indlæsningstidspunktet, så outputtabellen er muligvis ikke tilgængelig endnu, og skemaet kan ændres. Galleriet vil ikke gengive nogen elementer, når det ikke kender sit skema.

Det samme problem kan opstå, når Items er angivet til en variabel, der ikke initialiseres, når appen indlæses.

Du kan løse problemet ved at angive det forventede skema til Galleriet ved hjælp af en variabel. Angiv App.OnStart til:

If(false, Set(GalleryData, [{A: "abc", B: 123}]), Set(GalleryData, []))

Dette gør det muligt for systemet at udlede skemaet for GalleryData. Angiv egenskaben Items for galleriet til GalleryData, og opdater den derefter til den faktiske datakilde efter behov.

Antag ikke, at AllItems indeholder alle elementer i datasæt

Egenskaben AllItems indeholder de elementer, der i øjeblikket indlæses i galleriets synlige område – ikke alle elementer i Elementer. AllItems kan ændres, når brugeren ruller for at indlæse flere elementer. Denne egenskab bruges typisk til at få adgang til værdier for underordnede kontrolelementer, som brugeren interagerer med i øjeblikket, hvilket garanterer, at disse elementer indlæses.

Refererer ikke til et element i AllItems , hvis du ikke er sikker på, om brugeren har rullet til det pågældende element.

På samme måde er AllItemsCount antallet af elementer, der indlæses i visningen, ikke det samlede antal poster i Items. Hvis du vil hente det samlede antal poster i Items, skal du bruge CountRows(<expression used for Items property>).

Næste trin