es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Emitir evento al componente cuando los validadores son borrados.

He creado un componente de entrada personalizado. Su etiqueta se muestra cuando hay una restricción requerida (calculada en OnInit).

@Component({
  selector: 'custom-input',
  template: '<div *ngif="isMandatory()">Obligatorio</div><input>'
})
export class CustomInput implements ControlValueAccessor, OnInit {

mandatory = false;

constructor(
@Self()
@Optional()
public ngControl: NgControl
) {
super(ngControl);
}

ngOnInit(): void {
this.mandatory = this.isMandatory();
}

public isMandatory(): boolean {
let mandatory = false;
if (this.ngControl) {
const errors = new FormControl(”, this.ngControl.control.validator, this.ngControl.control.asyncValidator).errors;
mandatory = errors?.required;
}
return mandatory;
}

writeValue(value: string): void {
this.value = value;
}


Digamos que la restricción cambia. Me gustaría actualizar la etiqueta a medida que la entrada se vuelve opcional. ```typescript this.form = this.formBuilder.group({ custominput: new FormControl(null, Validators.required) }); // eliminar el validador requerido => quiero volver a calcular la variable 'mandatory' this.form.controls.customInput.clearValidators(); this.form.controls.customInput.updateValueAndValidity();

¿Cómo puedo actualizar mi etiqueta (enviar un evento dentro de mi componente)? Me gustaría evitar suscribirme a statusChanges.

El único truco que he encontrado es:

  writeValue(value: string): void {
    this.value = value;
    this.mandatory  = this.isMandatory();
  }

... 

this.form = this.formBuilder.group({
  customInput: new FormControl(null, Validators.required)
});

this.form.controls.customInput.clearValidators();
// Para activar la función writeValue
this.form.controls.customInput.setValue(this.form.controls.customInput.value);
this.form.controls.customInput.updateValueAndValidity();
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para actualizar la etiqueta en el componente de entrada personalizado cuando cambia la restricción requerida, puedes aprovechar el método writeValue. Este método es llamado por Angular cada vez que cambia el valor de la entrada. Por lo tanto, puedes actualizar la variable mandatory dentro del método writeValue para reflejar la nueva restricción.

    Primero, necesitas eliminar el validador requerido y actualizar el valor y la validez del control. Esto activará el método writeValue de tu componente de entrada personalizado. Sin embargo, necesitas forzar que este método se ejecute estableciendo el valor del control como sí mismo.

    this.form.controls.customInput.clearValidators();
    this.form.controls.customInput.updateValueAndValidity();
    this.form.controls.customInput.setValue(this.form.controls.customInput.value);
    

    Dentro del método writeValue de tu componente de entrada personalizado, puedes actualizar la variable mandatory llamando nuevamente al método isMandatory.

    writeValue(value: string): void {
      this.value = value;
      this.mandatory = this.isMandatory();
    }
    

    De esta manera, la etiqueta se actualizará siempre que cambie el estado obligatorio de la entrada, sin necesidad de suscribirse a cambios de estado.

Comments are closed.