Compartir a través de


Prácticas recomendadas y recomendaciones

La Galería es el único control que puede crear otros controles. Tiene su propio ámbito. Estas funciones avanzadas pueden provocar un comportamiento inesperado si la Galería no está configurada correctamente. Este artículo cubre las mejores prácticas y recomendaciones cuando trabaja con Galerías.

Es fácil crear un comportamiento inestable si OnChange o OnSelect de los controles secundarios modifica los Elementos de la galería principal. Por ejemplo, una entrada de texto en una galería puede tener su propiedad OnChange establecida en:

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

Esto normalmente está bien. La mayoría de los controles solo activarán OnChange cuando los usuarios cambien su valor directamente. Sin embargo, estos controles pueden causar problemas porque también activan OnChange cuando el sistema cambia su valor:

Por ejemplo, cuando ComboBox.DefaultSelectedItems cambia, se activa OnChange. Considere un cuadro combinado en una Galería con DefaultSelectedItems establecido en First(ThisItem.A) y su propiedad OnChange establecida en:

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

Esta expresión actualiza un registro en origen de datos de la galería que coincide con el nombre del elemento actual. El cambio consiste en reemplazar la columna A del registro con una nueva tabla.

Esto provoca un bucle infinito. Cuando el usuario cambia el valor del cuadro combinado, se activa OnChange, que actualiza GalleryData, que cambia DefaultSelectedItems (porque First(ThisItem.A) se refiere a una nueva tabla), que activa OnChange nuevamente, y así sucesivamente.

Para evitar bucles infinitos, puede utilizar controles modernos u otros controles que no activan OnChange cuando cambian sus datos.

Rendimiento lento al aplicar parches a elementos

Incluso si evita bucles no deseados, parchear o actualizar elementos de la Galería puede ser lento si la Galería tiene muchos elementos. La Galería no solo actualiza las filas asociadas con los registros modificados. En algunos casos, recarga todos los elementos. Esto se debe a la naturaleza poco estructurada de los orígenes de datos. Puede ser difícil para la Galería saber si solo un registro cambió o todo el origen de datos cambió.

Gallery.Selected puede cambiar de forma inesperada

La propiedad Seleccionada de la Galería es un objetivo en movimiento. Puede cambiar sin interacción del usuario cuando:

  • Gallery.Default cambia
  • Gallery.Items cambia
  • Actualizar orígenes de datos

Es posible que esto no sea deseable para su situación. Si desea una copia estable del elemento seleccionado por el usuario, considere almacenarlo en una variable. Por ejemplo, establezca la propiedad OnSelect de la Galería en una variable global CurrentItem:

Set(CurrentItem, Self.Selected)

Luego puede usar CurrentItem en otras partes de la aplicación para hacer referencia al elemento más reciente seleccionado por el usuario en lugar de por el sistema.

No use Gallery.Selected en un evento de control secundario

La propiedad Seleccionado de la Galería cambia cuando un usuario selecciona un elemento. Sin embargo, este evento no está relacionado con eventos de controles secundarios. Hacer referencia a Gallery.Selected en los eventos de un control secundario puede generar resultados inesperados.

Por ejemplo, cuando un usuario selecciona una Casilla de verificación en una Galería, ocurren los siguientes eventos:

  • Checkbox.OnSelect
  • Checkbox.OnCheck
  • Gallery.Selected cambia a la fila recién pulsada

El orden de estos eventos no está fijo. Esto es un problema si Checkbox.OnSelect está configurado en:

Notify(Gallery.Selected.Name)

Gallery.Selected es posible que todavía esté haciendo referencia a la fila seleccionada previamente cuando se ejecuta Checkbox.OnSelect.

Para evitar problemas de sincronización, no utilice Gallery.Selected en eventos. Si es necesario, utilice Gallery.OnSelect para responder a los cambios en Gallery.Selected.

Configurar Gallery.Items a una variable o salida de un componente de lienzo puede dar resultados inesperados, dependiendo de cuándo se establece o cambia la variable.

Las Galerías necesitan conocer el esquema de sus elementos cuando se carga la aplicación. Un esquema, también conocido como forma, es el nombre y el tipo de columnas en origen de datos. Tenga en cuenta esta tabla:

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

Su esquema consta de una columna de texto A y una columna de números B.

La mayoría de las veces, la Galería puede adivinar el esquema de sus Elementos a partir del origen de datos y las expresiones utilizadas en la aplicación. Pero si la propiedad Elementos se establece en la salida de un Componente de lienzo o control Import la Galería no puede determinar su esquema. Es posible que la tabla de salida de estos controles no esté disponible cuando se carga la aplicación y que el esquema incluso cambie. La Galería no representará ningún elemento cuando no conozca su esquema.

El mismo problema podría ocurrir cuando Elementos se establece en una variable que no se inicializa cuando se carga la aplicación.

Como solución alternativa, puede indicar el esquema esperado a la Galería con una variable. Establezca App.OnStart a:

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

Esto le permite al sistema conocer el esquema de la tabla GalleryData. Entonces, puede usar GalleryData como la propiedad Elementos de la Galería. Cámbielo al origen de datos real cuando sea necesario.

No asuma que AllItems contiene todos los elementos de su conjunto de datos

La propiedad AllItems son los elementos que se cargan para ver en una galería. No son todos los elementos de Artículos. AllItems puede cambiar cuando el usuario se desplaza por la galería para cargar más elementos. Normalmente, esta propiedad se utiliza para obtener valores de controles secundarios cuando el usuario interactúa con ellos. Por lo tanto, se garantiza que AllItems ha cargado ese elemento y es seguro consultarlo. No haga referencia a un elemento en AllItems si no está seguro de si el usuario lo ha visto.

De manera similar, AllItemsCount es la cantidad de elementos que se cargan para ver en la galería. No es el número total de registros en Artículos. Para obtener el total de registros en Artículos, utilice CountRows(<expression used for Items property>).

Pasos siguientes

Aislar problemas en aplicaciones de lienzo

Nota

¿Puede indicarnos sus preferencias de idioma de documentación? Realice una breve encuesta. (tenga en cuenta que esta encuesta está en inglés)

La encuesta durará unos siete minutos. No se recopilan datos personales (declaración de privacidad).