Compartilhar via


Melhores práticas e recomendações

A Galeria é o único controle capaz de criar outros controles. Ele tem o próprio escopo. Esses recursos avançados poderão acarretar um comportamento inesperado se a Galeria não estiver configurada corretamente. Este artigo aborda melhores práticas e recomendações durante o trabalho com Galerias.

Será fácil criar um comportamento instável se OnChange ou OnSelect de controles filho modificarem os Itens da galeria pai. Por exemplo, uma Entrada de texto em uma galeria pode ter a propriedade OnChange definida como:

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

Normalmente não há problema nisso. A maioria dos controles só vai disparar OnChange quando os usuários alterarem diretamente os valores. No entanto, esses controles podem causar problemas porque também disparam OnChange quando o sistema altera o valor:

Por exemplo, quando ComboBox.DefaultSelectedItems muda, ele dispara OnChange. Leve em consideração uma Caixa de combinação em uma Galeria com DefaultSelectedItems definida como First(ThisItem.A) e a propriedade OnChange definida como:

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

Essa expressão atualiza um registro na fonte de dados da galeria correspondente ao nome do item atual. A alteração deve substituir a coluna A do registro por uma nova tabela.

Isso causa um loop infinito. Quando o usuário altera o valor da Caixa de combinação, OnChange é disparado, que atualiza GalleryData, que altera DefaultSelectedItems (porque First(ThisItem.A) se refere a uma nova tabela), que dispara OnChange novamente e assim por diante.

Para evitar loops infinitos, você pode usar controles modernos ou outros controles que não disparam OnChange quando os dados são alterados.

Desempenho lento por causa da aplicação de patch em itens

Mesmo que você evite loops indesejados, a aplicação de patch ou atualização de itens daGaleria poderá ser lenta se a Galeria tiver muitos itens. A Galeria não atualiza apenas as linhas associadas aos registros alterados. Em alguns casos, ela recarrega todos os itens. Isso se deve à natureza pouco estruturada das fontes de dados. Pode ser difícil para a Galeria saber se apenas um único registro foi alterado ou se a fonte de dados toda foi alterada.

Gallery.Selected pode mudar inesperadamente

A propriedade Selecionada da Galeria é um destino móvel. Ele pode mudar sem interação do usuário quando:

  • Gallery.Default muda
  • Gallery.Items muda
  • Atualização das fontes de dados

Isso talvez não seja desejável para o cenário. Se você quiser uma cópia estável do item selecionado pelo usuário, leve em consideração armazená-lo em uma variável. Por exemplo, defina a propriedade OnSelect da Galeria como uma variável CurrentItem global:

Set(CurrentItem, Self.Selected)

Você pode acabar usando CurrentItem em outras partes do aplicativo para se referir ao item selecionado mais recentemente pelo usuário, e não pelo sistema.

Não use Gallery.Selected em um evento de controle filho

A propriedade Selecionada da Galeria muda quando um usuário seleciona um item. No entanto, esse evento não está relacionado a eventos de controle filho. A referência a Gallery.Selected em eventos de um controle filho pode acarretar resultados inesperados.

Por exemplo, quando um usuário marca uma Caixa de Seleção em uma Galeria, ocorrem os seguintes eventos:

  • Checkbox.OnSelect
  • Checkbox.OnCheck
  • Gallery.Selected muda para a linha recém-clicada

A ordem desses eventos não é fixa. Isso será um problema se Checkbox.OnSelect estiver definido como:

Notify(Gallery.Selected.Name)

Gallery.Selected ainda pode estar se referindo à linha selecionada anteriormente quando Checkbox.OnSelect é executado.

Para evitar problemas de sincronização, não use Gallery.Selected em eventos. Se necessário, use Gallery.OnSelect para responder a alterações feitas em Gallery.Selected.

A definição de Gallery.Items como uma variável ou saída de um componente Tela pode gerar resultados inesperados, dependendo de quando a variável é definida ou alterada.

Galerias precisam saber o esquema dos Itens quando o aplicativo é carregado. Um esquema, também conhecido como forma, é o nome e o tipo de colunas em uma fonte de dados. Leve em consideração esta tabela:

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

O esquema consiste em uma coluna de texto A e uma coluna numérica B.

Na maioria das vezes, a Galeria pode adivinhar o esquema dos Itens pela fonte de dados e pelas expressões usadas no aplicativo. Porém, se a propriedade Itens for definida como a saída de um controle Componente de tela ou Importar, Galeria não conseguirá determinar o esquema. A tabela de saída desses controles talvez não esteja disponível quando o aplicativo é carregado e o esquema pode até mesmo mudar. Galeria não vai renderizar nenhum item quando não souber o esquema.

O mesmo problema pode acontecer quando Itens é definido como uma variável não inicializada quando o aplicativo é carregado.

Como solução alternativa, você pode dar a dica do esquema esperado para a Galeria com uma variável. Defina App.OnStart como:

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

Isso permite que o sistema saiba o esquema da tabela GalleryData. Você pode acabar usando GalleryData como a propriedade Itens da Galeria. Altere-o para o fonte de dados real quando necessário.

Não presuma que AllItems contém todos os itens de seu conjunto de dados

A propriedadeAllItems são os itens que são carregados na exibição em uma galeria. Não são todos os itens em Itens. AllItems pode ser alterada quando o usuário rola na galeria para carregar mais itens. Normalmente, essa propriedade é usada para obter valores de controles filho quando o usuário está interagindo com eles. Portanto, AllItems garante que esse item seja carregado e que seja seguro consultá-lo. Não faça referência a um item em AllItems se não tiver certeza se o usuário o viu.

Da mesma forma, AllItemsCount é o número de itens que são carregados na exibição na galeria. É o número total de registros em Itens. Para obter o total de registros em Itens, use CountRows(<expression used for Items property>).

Próximas etapas

Isole problemas em aplicativos de tela