Не работает проверка валидатора цифровых и алфавитных шаблонов элементов управления реактивной формой Angular

#angular #angular-reactive-forms #angular-validator

#angular #angular-reactive-forms #angular-validator

Вопрос:

Я создаю пользовательскую реактивную форму из динамического значения JSON, пытаясь скрыть символ, введенный пользователем в текстовое поле, в символ звездочки,

Пример: допустим, пользователь вводит «hello world».

Ожидаемый результат: **********, это должно произойти, когда пользователь вводит каждый символ

также будет проведена проверка шаблона, например, только алфавит и только число,

Я достиг вышеуказанного ожидаемого результата, но проверка работает не так, как ожидалось

Кодируйте то, что я пробовал

  SetValidations(val: any) {
    this.formBuilder.control(val.key);
    this.newGeographyForm.addControl(
      val.key.toString(),
      new FormControl('')
    );
    let validators = this.getValidatorFnArray(val.templateOptions)
    debugger
    this.newGeographyForm.get(val.key).setValidators(validators)

    val.templateOptions.input_mask > 0 ?this.MaskValue(val.key,val.templateOptions.input_mask) : ''

  }
MaskValue(formControlVal:any,maskType:any){
    const regex = /S/gi;
    const subst = `*`;
    this.newGeographyForm.get(formControlVal).valueChanges.pipe(distinctUntilChanged()).subscribe(fVal=>{
      const result = fVal.replace(regex, subst);
      this.newGeographyForm.get(formControlVal).patchValue( result, {emitEvent: false});
      this.newGeographyForm.get(formControlVal).updateValueAndValidity();
    })
  }

  getValidatorFnArray(obj): ValidatorFn[] {
    const validators = [];
    if (obj.is_mandatory) {
      debugger
      validators.push(Validators.required);
    }
    if (obj.min != null) {
      debugger
      validators.push(Validators.minLength(obj.min));
    }
    if (obj.max != null) {
      validators.push(Validators.maxLength(obj.max));
    }
    if (obj.regex != null) {
      validators.push(Validators.pattern(obj.regex));
    }
    return validators
  }
  

Ответ №1:

Я проделал аналогичные попытки «создать форму из полезной нагрузки», похоже, логика добавления валидаторов довольно здравая, возможно, вы захотите создать какой-нибудь индикатор для части шаблона, который обозначает его как скрытое поле, и динамически отображать его. Таким образом, со всем этим можно справиться input type="password" .

Редактировать:

Похоже, что вы хотите сохранить значение внутри объекта FormControl, но чтобы ваш шаблон отображал что-то другое для пользователя (****foo1, где видны последние 4, остальные *)

Именно этой роли удовлетворяет пользовательская реализация ControlValueAccessor. Это соединение между элементом поля формы html и фактической моделью формы, которую вы используете для хранения / отправки данных формы.

Я бы изучил это, это немного сбивает с толку, но есть несколько надежных руководств / примеров stackblitz, возможно, потребуется немного покопаться. Желаю удачи!

Комментарии:

1. Если я использую пароль, то есть другие требования к отображению только последних 4 символов, а остальные скрыты, этого нельзя достичь, используя пароль типа, верно?.

2. это невозможно. Возможно, вы оказались в ситуации, когда вам нужна пользовательская реализация ControlValueAccessor: indepth.dev / …