Array Validators
Paquete: @tiendana/ngx-core/validators
Validadores para verificar la longitud de arrays en un FormControl: selecciones múltiples, etiquetas, adjuntos.
Características
✅ minLengthArray y maxLengthArray como funciones ValidatorFn
✅ Clave de error configurable para mensajes específicos por contexto
✅ Payload con requiredLength y actualLength para mensajes dinámicos
✅ Un valor que no es array (null, undefined) es válido: no interfiere con Validators.required
import { minLengthArray, maxLengthArray } from '@tiendana/ngx-core/validators';
Validadores Disponibles
minLengthArray
Verifica que un array tenga un número mínimo de elementos.
function minLengthArray(min: number, errorKey: string = 'minLength'): ValidatorFn
| Parámetro | Tipo | Default | Descripción |
|---|---|---|---|
min | number | — | Número mínimo de elementos |
errorKey | string | 'minLength' | Nombre de la clave del error |
Error: { minLength: { requiredLength: number, actualLength: number } }
form = this.fb.group({
tags: [[] as string[], minLengthArray(2)]
});
maxLengthArray
Verifica que un array no exceda un número máximo de elementos.
function maxLengthArray(max: number, errorKey: string = 'maxLength'): ValidatorFn
| Parámetro | Tipo | Default | Descripción |
|---|---|---|---|
max | number | — | Número máximo de elementos |
errorKey | string | 'maxLength' | Nombre de la clave del error |
Error: { maxLength: { requiredLength: number, actualLength: number } }
form = this.fb.group({
tags: [[] as string[], maxLengthArray(10)]
});
Las claves por defecto son minLength y maxLength (con L mayúscula), distintas de las de Angular, minlength y maxlength, que son las de Validators.minLength y Validators.maxLength para cadenas. Escribe tdnError="minLength" para estos validadores.
Si el valor es null, undefined o no es un array, el validador devuelve null (válido). Combínalo con Validators.required si el campo es obligatorio.
Ejemplos y Demos
Los arrays se editan, por ejemplo, con tdn-input-tag. Los mensajes se muestran con el [tdnErrors] del control; ver Manejo de Errores.
Validación de Mínimo de Elementos
Ver código
Validación de Máximo de Elementos
Ver código
Validación de Rango (Mínimo y Máximo)
Ver código
Error Key Personalizado
Ver código
Casos de Uso Comunes
Tags/Etiquetas
tags: [[] as string[], [Validators.required, minLengthArray(1), maxLengthArray(20)]]
Selección Múltiple de Opciones
selectedOptions: [[] as number[], minLengthArray(1, 'atLeastOne')]
Archivos Múltiples
attachments: [[] as File[], [minLengthArray(1), maxLengthArray(5)]]
Combinación con Otros Validadores
Con Validators.required
Validators.required de Angular rechaza el array vacío ([]), igual que la cadena vacía. Lo que no hace es limitar la cantidad. Con [] fallan los dos a la vez (required y minLength), y se ven ambos mensajes. Para mostrar uno solo, condiciona el de minLength o usa solo minLengthArray.
Con un valor null o undefined, minLengthArray no falla, ni siquiera minLengthArray(1). Si null es un estado posible del control, añade Validators.required para atraparlo.
Con Validadores Personalizados
function uniqueValues(): ValidatorFn {
return (control: AbstractControl): ValidationErrors | null => {
const value = control.value;
if (!Array.isArray(value)) return null;
return new Set(value).size !== value.length ? { duplicates: true } : null;
};
}
form = this.fb.group({
items: [[] as string[], [minLengthArray(2), maxLengthArray(10), uniqueValues()]]
});
Estructura del Error
Ambos validadores devuelven un objeto con el requisito y la longitud actual:
{ minLength: { requiredLength: 3, actualLength: 1 } }
{ maxLength: { requiredLength: 10, actualLength: 12 } }
Para un mensaje dinámico lee el error del bloque exportado con #errors="tdnErrors":
<div [tdnErrors]="'tags'" #errors="tdnErrors">
<small tdnError="minLength">
Se requieren al menos {{ errors.errors()?.['minLength']?.requiredLength }} elementos.
Tienes {{ errors.errors()?.['minLength']?.actualLength }}.
</small>
</div>
Notas Importantes
- Seguridad ante nulos: devuelven
null(válido) si el valor no es un array. - Clave configurable: útil para mensajes más específicos según el contexto.
- Vacío vs
required:Validators.requiredya rechaza[];minLengthArray(n)añade el mínimo. - Solo longitud: no inspeccionan el contenido de los elementos.
- Síncronos: ambos son validadores síncronos.
Ver También
- CustomValidators: validadores para otros tipos de datos
- TdnInputTag: componente para arrays de cadenas
- Manejo de Errores: mostrar los errores en pantalla