我正在尝试使用JavaScript创建用于输入验证的类。

例如,我创建的ExampleValidators类:

export class ExampleValidator {
    private args: any;
    private errors = [];
    constructor(argsz) {
        this.args = argsz;
    }

    public required(inputName: string, customErrorMessage: string) {
        if (this.hasErrors(inputName)) return this;

        if (this.args.controls[inputName].value === null) {
            customErrorMessage = customErrorMessage ? customErrorMessage : inputName + ' Is required';
            this.addErrors(inputName, customErrorMessage);
        }

        return this;
    }

    public message(message: string) {
        this.errors = [];
        return this.errors = [message]
    }

    private addErrors(inputName: string, errorMessage: string) {
        this.errors[inputName] = errorMessage;
    }

    private hasErrors(inputName: string) {
        const errors = this.errors[inputName];
        return typeof errors === 'undefined' ? false : true;
    }
}


之后,我尝试通过一条消息来使用该类:

private isValid() {
        this.exampleValidator.required('loginDateFrom');
        this.exampleValidator.required('loginDateTo').message('An example message: 02');
        return this.exampleValidator.passes();
    }


但是在显示后,该错误并未特别出现:必需(“ loginDateTo”),但更改了出现的整体错误。

我怎么知道使用“自定义消息”来自引用:required(“ loginDateTo”),以便“自定义错误消息”对“ required”(“ loginDateFrom”)无效?

我试过使用:

this.exampleValidator ('loginDateTo'). message ('loginDateTo', 'Some Message').

要么

this.exampleValidator ('loginDateTo', 'Some Message');

它可以工作,但是我只想尝试使用自定义消息,如上所述:

this.exampleValidator ('loginDateTo'). message ('Some Message')

如何从方法“消息”中的上一个方法“必需”获得引用?

还是有另一种方法?

先感谢您。

最佳答案

当您已经验证require调用上的检查时,此后将无法添加消息。但是,您只能在调用require时创建规则列表,然后在调用passes()时对它们求值。这样,require可以返回对规则的引用,并且可以在应用规则之前对其进行修改:

  class Rule {
   public _message = "";
   constructor(public readonly name: string) {}
   message(msg) { this._message = msg; }

   validate(obj) {
    if(obj[this.name]) return null;
    // an error occurs:
    return this._message || `${this.name} is required`;
   }
}

class Validator {
  rules: Rule[] = [];

  require(name) {
    const rule = new Rule(name);
    this.rules.push(rule);
    return rule;
  }

  passes() {
    const errors = this.rules.map(it => it.validate(/*...*/)).filter(it => it);
   const isValid = !errors.length;
   //...
  }
 }

关于javascript - 从JavaScript/TypeScript类中的另一个方法获取引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56197891/

10-12 15:18