当前位置: 首页 > 知识库问答 >
问题:

角度反应式表单控制数字和字母模式验证器验证不起作用

郝永思
2023-03-14

我正在从动态JSON值创建一个自定义的反应式表单,试图将用户在输入框中输入的字符隐藏为星号符号,

示例:假设用户正在键入“你好世界”。

预期输出:*********,当用户键入每个字符时应该会出现此输出

还将有模式验证,如仅字母和仅数字,

我已经实现了上述预期输出,但验证没有按预期工作

编码我尝试过的内容

 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个答案

武友樵
2023-03-14

我做过类似的“从有效负载创建表单”工作,看起来添加验证器的逻辑很合理,但您可能希望为模板侧的内容制作一些指示符,将其表示为隐藏字段,并动态显示它。这样就可以用input type=“password”来处理。

编辑:

听起来你想做的是在formControl对象中保存值,但让你的模板向用户显示不同的东西(****fo1,其中最后4个可见,其余的是*)

这正是自定义controlValueAccessor实现所满足的角色。它是html表单域元素和您用来存储/发送表单数据的实际表单模型之间的连接。

我会研究它,这有点令人困惑,但有一些可靠的教程/stackblitz示例,可能需要一些挖掘。祝你好运!

 类似资料:
  • 我定义了以下验证: 它用于验证邮政编码,但当我输入字符串“K1K1A1”时,验证器说它无效。 我的正则表达式怎么了?

  • 我试图建立一个注册表格使用角6反应形式。 } 我如何进行验证,以便允许: < li >数字 < li >大写字母 < li >小写字母 < li >任何特殊字符 < li >最少8个字符 我使用的这个正则表达式工作正常,但是我不能使用任何其他特殊字符,例如我尝试了< code>Demoo123#但是没有工作。然而< code>Demoo123@运行良好。我假设我的正则表达式中的特殊字符部分有问题。

  • 我需要制作一个密码模式验证器 密码应具有: < li>1个大写字母 < li>1个小写字母 < li >一个号码 < li >最小长度为8。 我发现了这个正则表达式模式: 然而,验证器总是声称我的输入无效 根据 https://regex101.com/r/AfAdKp/1 此值应该是有效的。 编辑:澄清一下,Test1234应该可以工作

  • 我需要验证密码输入表单字段的强度。要求是: < li >至少一个小写字符 < li >至少一个大写字符 < li >至少一个号码< br >(无论顺序) 我迄今为止搜索和尝试的结果如下,结果不一致。 它似乎验证了正则表达式验证的顺序。 我需要的是检查是否存在至少一个字符“类型”。

  • 我对Angular很陌生,我正在尝试使用Angular和Bootstrap 4创建一个注册表单。 我想要的结果是使用Bootstrap的样式和Angular的验证。更准确地说,在验证表单时,Angular在两个不同的地方应用样式(ng-valid、ng-invalid等):input元素和form元素。 我使用的是反应形式,我想避免这样的事情(未测试): 有没有一个简单的方法(不是太冗长)来实现这

  • 我使用的是角反应形式。在表单组的窗体控件中,我使用无法正常工作的正则表达式设置了验证器.模式,我不明白为什么。我已经验证了这个网站上的正则表达式 https://www.regextester.com/99144,以检查它,它工作正常 正则表达式(最少八个字符,至少一个大写字母,一个小写字母,一个数字和一个特殊字符) 这是表单组 因此,当我键入“World@20”时,它验证为真,但当我开始键入“W