根据复杂角色和角色位置验证输入文本字段

时间:2018-07-27 06:17:27

标签: angular typescript validation angular-reactive-forms

基本上,我是Angular和Java脚本的初学者。这里试图在某些条件下验证“反应形式文本”字段。

条件是:

  1. 最小长度应为7,最大为25。
  2. 有效输入可以是字母数字值以及通配符中的“星号(*)”。尽管文本字段允许输入其他特殊字符,但该输入被视为无效。
  3. 允许
  4. Asterisk()从第5位到第13位作为输入,在Asterisk()之后,其他所有内容均视为无效。 例如:8500 * 001001…(无效)8500 *(有效)

    我知道可以编写简单的自定义验证。如果有任何想法,请帮助我,或者您也可以建议我。提前致谢。

1 个答案:

答案 0 :(得分:0)

如果您知道可以使用Validators.pattern的正则表达式模式,则可能有多种方法,我建议编写自定义验证器比复杂的正则表达式模式更易于维护和可读。提供有关值验证的自定义错误消息,另一件事自定义验证器只是一个函数,如果验证失败,则该函数返回一个对象;如果验证成功,则返回null。

自定义反应形式验证器

import { AbstractControl, ValidationErrors } from "@angular/forms"

export const inputTextValidator = function inputTextValidator(control: AbstractControl): ValidationErrors | null {

  let getErrorObject = function (message): ValidationErrors {
    return {
      inputText: true,
      message // provide custom error message related to the validation role
    }
  }

  let value: string = control.value || '';

  // check if value length between specific range like 7-25
  if (value.length < 7 && value.length < 25) {
    return getErrorObject(`text length must be between 7-25 ,current length ${value.length}`);
  }

  // check if value invalid characters  like #$%^%$^/-+
  let validCharacters = /^[a-zA-Z0-9\*]+$/g
  if (validCharacters.test(value) === false) {
    return getErrorObject(`text has invalid characters,current value ${value.length}`);
  }

  let asterisk = /^\w+\*?$/g
  if (asterisk.test(value) === false) {
    return getErrorObject(`only one asterisk at the end of the string is valid,current value ${value.length}`);
  }

  // check the asterisk postion at 8th-13th 
  let indexOfAsterisk: number = value.indexOf('*'); // index base on 0
  if (indexOfAsterisk >= 0 && (indexOfAsterisk < 8 || indexOfAsterisk > 12)) {
    return getErrorObject(`asterisk must bee in postion at 8 -13 th,current * postion ${indexOfAsterisk}`);
  }

  return null;
}
  

在您的示例中未显示的是从5号开始的星号有效位置,这将中断关于值的最小长度的第一个角色,为什么我要确保最小长度为8

stackblitz example