Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A Galeria é o único controlo que pode criar outros controlos. Tem o seu próprio âmbito. Estas caraterísticas avançadas podem levar a um comportamento inesperado se a Galeria não estiver configurada corretamente. Este artigo aborda melhores práticas e recomendações ao trabalhar com Galerias.
Não altere os itens da galeria a partir de dentro da galeria
É fácil criar um comportamento instável se OnChange ou OnSelect de controlos subordinados modificarem os Itens da galeria principal. Por exemplo, uma Entrada de texto numa galeria pode ter a respetiva propriedade OnChange definida como:
Patch(GalleryData, ThisItem, {Name: TextInput.Text})
Normalmente, isto não causa problemas. A maioria dos controlos só acionará OnChange quando os utilizadores alterarem os respetivos valores diretamente. No entanto, estes controlos podem causar problemas porque também acionam OnChange quando o sistema altera o respetivo valor:
Por exemplo, quando ComboBox.DefaultSelectedItems muda, aciona OnChange. Considere uma Caixa de combinação numa Galeria com DefaultSelectedItems definido como First(ThisItem.A) e a respetiva propriedade OnChange definida como:
UpdateIf(GalleryData, Name = ThisItem.Name, {
A: Table({
B: First(Self.SelectedItems).B
})
})
Esta expressão atualiza um registo na origem de dados da galeria que corresponde ao nome do item atual. A alteração destina-se a substituir a coluna A do registo por uma nova tabela.
Isto causa um ciclo infinito. Quando o utilizador altera o valor da Caixa de combinação, OnChange é acionado, o que atualiza GalleryData, o que altera DefaultSelectedItems (porque First(ThisItem.A) refere-se a uma nova tabela), o que aciona OnChange novamente e assim por diante.
Para evitar ciclos infinitos, pode usar controlos modernos ou outros controlos que não acionam OnChange quando os respetivos dados são alterados.
Desempenho lento devido à aplicação de patches em itens
Mesmo que evite ciclos indesejados, a aplicação de patches ou a atualização de itens da Galeria pode ser lento se a Galeria tiver muitos itens. A Galeria não atualiza apenas as linhas associadas aos registos alterados. Em alguns casos, recarrega todos os itens. Isto deve-se à natureza pouco estruturada das origens de dados. Pode ser difícil para a Galeria saber se apenas um único registo foi alterado ou se a origem de dados inteira foi alterada.
Gallery.Selected pode mudar inesperadamente
A propriedade Selected da Galeria é um alvo móvel. Pode mudar sem interação do utilizador quando:
- Gallery.Default muda
- Gallery.Items muda
- Atualizar origens de dados
Isto pode não ser desejável para o seu cenário. Se pretende uma cópia estável do item selecionado pelo utilizador, considere armazená-lo numa variável. Por exemplo, defina a propriedade OnSelect da Galeria como uma variável global CurrentItem:
Set(CurrentItem, Self.Selected)
Pode então usar CurrentItem noutras partes da aplicação para se referir ao item mais recente selecionado pelo utilizador, em vez de pelo sistema.
Não use Gallery.Selected no evento de um controlo subordinado
A propriedade Selected da Galeria muda quando um utilizador seleciona um item. No entanto, este evento não está relacionado com eventos de controlos subordinados. Fazer referência a Gallery.Selected nos eventos de um controlo subordinado pode levar a resultados inesperados.
Por exemplo, quando um utilizador seleciona uma Caixa de verificação numa Galeria, ocorrem os seguintes eventos:
Checkbox.OnSelectCheckbox.OnCheck-
Gallery.Selectedmuda para a linha recém-clicada
A ordem destes eventos não é fixa. Isto é um problema se Checkbox.OnSelect estiver definido como:
Notify(Gallery.Selected.Name)
Gallery.Selected ainda pode estar a referir-se à linha selecionada anteriormente quando Checkbox.OnSelect é executado.
Para evitar problemas de temporização, não use Gallery.Selected em eventos. Se necessário, use Gallery.OnSelect para responder a alterações a Gallery.Selected.
Certifique-se de que a Galeria conhece o esquema dos respetivos itens
Definir Gallery.Items como uma variável ou saída de um Componente de tela pode gerar resultados inesperados, dependendo de quando a variável é definida ou alterada.
As Galerias precisam de conhecer o esquema dos respetivos Itens quando a aplicação é carregada. Um esquema, também conhecido como forma, é o nome e o tipo de colunas numa origem de dados. Considere esta tabela:
[{A: "abc", B: 123}, {A: "def", B: 456}]
O respetivo esquema consiste de uma coluna de texto A e de uma coluna numérica B.
Na maioria das vezes, a Galeria pode adivinhar o esquema dos respetivos Itens da origem de dados e expressões usadas na aplicação. Mas se a propriedade Itens for definida como a saída de um Componente de tela ou o controlo Importar, a Galeria não consegue determinar o respetivo esquema. A tabela de saída destes controles pode não estar disponível quando a aplicação é carregada e o esquema pode até mudar. A Galeria não irá compor qualquer item quando não conhece o respetivo esquema.
O mesmo problema pode acontecer quando Itens é definido como uma variável que não é inicializada quando a aplicação é carregada.
Como solução alternativa, pode sugerir o esquema esperado para a Galeria com uma variável. Defina App.OnStart como:
If(false, Set(GalleryData, [{A: "abc", B: 123}]), Set(GalleryData, []))
Isto permite que o sistema conheça o esquema da tabela GalleryData. Em seguida, pode usar GalleryData como a propriedade Itens da Galeria. Altere-a para a origem de dados real quando necessário.
Não assuma que AllItems contém todos os itens do respetivo conjunto de dados
A propriedade AllItems são os itens que são carregados na vista numa galeria. Nem todos os itens estão em Itens. AllItems pode mudar quando o utilizador se desloca na galeria para carregar mais itens. Normalmente, esta propriedade é utilizada para obter valores de controlos subordinados quando o utilizador está a interagir com eles. Assim, é garantido que AllItems carregou esse item e é seguro consultá-lo. Não consulte um item em AllItems se não tiver a certeza se o utilizador o viu.
Da mesma forma, AllItemsCount é o número de itens que são carregados na vista na galeria. Não é o número total de registos em Itens. Para obter o total de registos em Itens, utilize CountRows(<expression used for Items property>).