¿Es posible crear un validador que pueda usar múltiples valores para decidir si mi campo es válido?
Por ejemplo, si el método de contacto preferido del cliente es el correo electrónico, el campo de correo electrónico debe ser obligatorio.
Gracias.
Actualizado con código de ejemplo ...
import {Component, View} from 'angular2/angular2';
import {FormBuilder, Validators, formDirectives, ControlGroup} from 'angular2/forms';
@Component({
selector: 'customer-basic',
viewInjector: [FormBuilder]
})
@View({
templateUrl: 'app/components/customerBasic/customerBasic.html',
directives: [formDirectives]
})
export class CustomerBasic {
customerForm: ControlGroup;
constructor(builder: FormBuilder) {
this.customerForm = builder.group({
firstname: [''],
lastname: [''],
validateZip: ['yes'],
zipcode: ['', this.zipCodeValidator]
// I only want to validate using the function below if the validateZip control is set to 'yes'
});
}
zipCodeValidator(control) {
if (!control.value.match(/\d\d\d\d\d(-\d\d\d\d)?/)) {
return { invalidZipCode: true };
}
}
}
equal
yequalTo
métodos y documentación bueno!Respuestas:
Para reiterar los métodos que otros han publicado, esta es la forma en que he estado creando
FormGroup
validadores que no involucran a varios grupos.Para este ejemplo, simplemente proporcione los nombres clave de los campos
password
yconfirmPassword
.Para
Validators
poder tomar parámetros, deben devolver afunction
conFormGroup
oFormControl
como parámetro. En este caso, estoy validando unFormGroup
.Técnicamente, podría haber validado dos valores si hubiera conocido sus claves, pero prefiero nombrar mi
Validators
igual que el error que devolverán. La función podría modificarse para tomar un tercer parámetro que represente el nombre de clave del error devuelto.Actualizado el 6 de diciembre de 2016 (v2.2.4)
Ejemplo completo: https://embed.plnkr.co/ukwCXm/
fuente
FormGroup
validación anidada para manejar múltiples campos en lugar de poner unaValidator
en todo.[{validator: matchingPasswords('password', 'confirmPassword')},{validator: matchingEmail('email', 'confirmemail')}]
Intenté esto pero no funciona. Alguna sugerencia ? @DaveLa respuesta de Dave fue muy, muy útil. Sin embargo, una pequeña modificación podría ayudar a algunas personas.
En caso de que necesite agregar errores a los
Control
campos, puede mantener la construcción real del formulario y los validadores:En lugar de establecer un error en el
ControlGroup
, hágalo en el campo real de la siguiente manera:fuente
passwordConfirmationInput.setErrors(passwordConfirmationInput.validator(passwordConfirmationInput))
en laelse
rama para que se actualice correctamente cuando un cambio enpasswordInput
hace que los datos sean válidos.TypeError: passwordConfirmationInput.validator is not a function
. Es porque no creé explícitamente el FormControl con Validators.required. Dejé los validadores en blanco y en su lugar utilicé el atributo "requerido" en la entrada.{[key: string]: any}
, quesetErrors(...)
ya no regresa (¿ya?). TambiénsetErrors(...)
sobrescribe cualquier error que ya esté presente, así que agregué al objeto de error actual como:let errors = formGroup.controls[passwordConfirmationKey].errors;
yif(!errors) errors={};
yerrors['notEquivalent'] = true;
yformGroup.controls[dateControlFirst].setErrors(errors);
Al implementar validadores para múltiples campos de formulario, deberá asegurarse de que los validadores se vuelvan a evaluar cuando se actualice cada uno de los controles de formulario. La mayoría de los ejemplos no proporcionan una solución para tal escenario, pero esto es muy importante para la coherencia de los datos y el comportamiento correcto.
Consulte mi implementación de un validador personalizado para Angular 2, que tiene esto en cuenta: https://gist.github.com/slavafomin/17ded0e723a7d3216fb3d8bf845c2f30 .
Estoy usando
otherControl.valueChanges.subscribe()
para escuchar cambios en otro control ythisControl.updateValueAndValidity()
para activar otra ronda de validación cuando se cambia otro control.Estoy copiando un código a continuación para referencia futura:
match-other-validator.ts
Uso
Así es como puede usarlo con formas reactivas:
Se pueden encontrar validadores más actualizados aquí: moebius-mlm / ng-validators .
fuente
this
para? En realidad, es bueno tener una función con nombre para fines de depuración.othercontrol.valuechanges.subscribe
no se dio de baja en ninguna parte.valueChanges
observable cuandootherControl
se destruya, lo que hará que la suscripción también se cancele. Sin embargo, sus preocupaciones podrían ser válidas. Sugeriría depurar a fondo este código con la última versión de Angular usando varios casos de prueba. Por favor, informe si encuentra algún problema.Estoy usando Angular 2 RC.5 pero no pude encontrar ControlGroup, según la útil respuesta de Dave. Encontré que FormGroup funciona en su lugar. Así que hice algunas actualizaciones menores sobre los códigos de Dave y pensé en compartir con otros.
En su archivo de componentes, agregue una importación para FormGroup:
Defina sus entradas en caso de que necesite acceder al control de formulario directamente:
En su constructor, cree una instancia de su formulario:
Agregue la función matchingPasswords en su clase:
Espero que esto ayude a aquellos que están usando RC.5. Tenga en cuenta que todavía no he probado en RC.6.
fuente
if (passwordInput.value !== passwordConfirmationInput.value) { return passwordConfirmationInput.setErrors({ notEquivalent: true }); } else { return passwordConfirmationInput.setErrors(null); }
Mucha excavación en fuente angular, pero he encontrado una mejor manera.
Parte HTML para el grupo de contraseñas
fuente
Para ampliar la respuesta de matthewdaniel, ya que no es exactamente correcta. Aquí hay un código de ejemplo que muestra cómo asignar correctamente un validador a un
ControlGroup
.Aquí hay un ejemplo de trabajo: http://plnkr.co/edit/Zcbg2T3tOxYmhxs7vaAm?p=preview
fuente
ControlGroup
se elimina a favor deFormGroup
cualquiera que esté mirando esto. Ejemplo de Docs y Learn Angular2Aquí hay otra opción que pude encontrar que no depende de un todo o sub,
ControlGroup
sino que está vinculada directamente a cada unoControl
.El problema que tuve fue que los controles que dependían entre sí no estaban juntos jerárquicamente, por lo que no pude crear un archivo
ControlGroup
. Además, mi CSS se configuró para que cada control aprovechara las clases angulares existentes para determinar si mostrar el estilo de error, que era más complicado cuando se trataba de una validación de grupo en lugar de una validación específica de control. No fue posible intentar determinar si un solo control era válido, ya que la validación estaba vinculada al grupo de controles y no a cada control individual.En mi caso, quería el valor de un cuadro de selección para determinar si se requeriría otro campo o no.
Esto se construye usando el Form Builder en el componente. Para el modelo de selección, en lugar de vincularlo directamente al valor del objeto de solicitud, lo he vinculado para obtener / establecer funciones que me permitirán manejar eventos "al cambiar" para el control. Entonces podré configurar manualmente la validación para otro control dependiendo del nuevo valor de los controles seleccionados.
Aquí está la parte de la vista relevante:
La porción del componente relevante:
En mi caso, siempre tuve una validación de patrón vinculada al control, por lo
validator
que siempre se establece en algo, pero creo que puede establecerlavalidator
en nulo si no tiene ninguna validación vinculada al control.ACTUALIZACIÓN: Existen otros métodos para capturar el cambio de modelo como
(ngModelChange)=changeFunctionName($event)
o suscribirse a cambios de valor de control mediante el uso dethis.form.controls["employee"].valueChanges.subscribe(data => ...))
fuente
Probé la mayoría de estas respuestas, pero ninguna funcionó para mí. Encontré un ejemplo de trabajo aquí https://scotch.io/@ibrahimalsurkhi/match-password-validation-with-angular-2
fuente
También estaba buscando esto y terminé usando el
equalTo
paquete ng2-validation ( https://www.npmjs.com/package/ng2-validation )Aquí hay un ejemplo: Basado en plantilla:
Impulsado por modelo:
Modelo:
fuente
Aquí está mi versión que utilicé para asegurar que una edad en un campo sea mayor o igual a la edad en otro campo. También estoy usando grupos de formularios, así que uso la
group.get
función en lugar degroup.controls[]
Y en el componente:
fuente
Creo que tu mejor opción, por ahora, es crear un grupo de formularios para mantener tus controles. Cuando crea una instancia de su Control, pase la función para validarlo. ejemplo:
Sé que esto depende en gran medida de la versión de angularjs2 que esté ejecutando. Esto fue probado contra 2.0.0-alpha.46
Si alguien tiene una sugerencia mejor, como escribir un validador personalizado (que puede ser la mejor manera de hacerlo), es bienvenido.
EDITAR
también puede usar ControlGroup y validar ese grupo por completo.
Simplemente edite los mensajes según su dominio.
fuente
La respuesta de Louis Cruz fue muy útil para mí.
Para completar simplemente agregue en el else el restablecimiento de setErrors: return passwordConfirmationInput.setErrors (null);
¡Y todo funciona bien!
Gracias,
Saludos,
TGA
fuente
Angular 8 Ejemplo de validación en el campo de confirmación de contraseña
FYI: esto no actualizará la validación en el campo passwordConfirm si se cambia el campo principal de "contraseña" después de que esta validación haya pasado. Pero, puede invalidar el campo de confirmación de contraseña cuando un usuario escribe en el campo de contraseña
register.component.ts
validator.ts de confirmación de contraseña
register.component.html
fuente
Sugeriría usar la biblioteca
ng-form-rules
. Es una biblioteca impresionante para crear todo tipo de formularios con una lógica de validación desacoplada del componente y que puede depender de los cambios de valor de otras áreas del formulario. Tienen gran documentación , ejemplos y un video que muestra gran parte de su funcionalidad . Hacer una validación como esta, lo que está tratando de hacer es trivial.Puede consultar su archivo README para obtener información de alto nivel y un ejemplo básico.
fuente
Reglas de validación de coincidencias de contraseña de Angular 4.
Si necesita campos de control de errores, puede hacerlo.
Entonces necesitas declarar este método en el
constructor
método Like as.En lugar de establecer un error en ControlGroup, hágalo en el campo real de la siguiente manera:
Parte HTML para el grupo de contraseñas
fuente