【问题标题】:ngx-schema-form: Add custom validation messages (Angular 6)?ngx-schema-form:添加自定义验证消息(Angular 6)?
【发布时间】:2018-06-25 11:13:24
【问题描述】:

我正在使用 NGX-Schema-Form https://github.com/makinacorpus/ngx-schema-form 来呈现基于 json 对象的表单字段。

我的问题是:如何将自定义验证错误消息添加到我的架构中,以及如何在 ui 上正确显示它们 (Bootstrap 4.1 based)。

这是标准模式格式的示例:

注意: 模式、minLength、maxLength

mySchema = {
"properties": {
    "cellphoneNumber": {
        "type": "string",
        "title": "Cellphone number",
        "placeholder": "e.g. 082 320 2121",
        "widget": {
            "id": "string"
        },
        "pattern": "^\\d{10}$",
        "minLength": 5,
        "maxLength": 12
    }
}

但我想做什么:

mySchema = {
"properties": {
    "cellphoneNumber": {
        "type": "string",
        "title": "Cellphone number",
        "placeholder": "e.g. 082 320 2121",
        "widget": {
            "id": "string"
        },
        pattern: {
            value: '^\\d{10}$',
            message: 'Cellphone number must be 10 digits'
        },
        minLength: {
            value: '5',
            message: 'Please enter at least 5 characters'
        }
        maxLength: {
            value: '14',
            message: 'Please enter no more than least 14 characters'
        }
    }
}

有什么想法吗?

如果表单和字段是 ng-dirty 和 ng-touched,如何覆盖标准字符串小部件以显示此错误。

粗略的例子:

<div class="error mt-2" *ngIf="control.errors && control.pristine == false || control.touched == true">
  <div *ngFor="let err of control.errors">
    {{ err.message }}
  </div>
</div>

我正在为企业级实施寻找可靠的解决方案。

【问题讨论】:

  • 您有没有尝试过实现这一目标?
  • 是的,我已尝试像在粗略示例中那样显示适当的消息,但返回的错误是标准角度模式、minLength、maxLength 错误消息。:[ { "code": "PATTERN", "params": [ "^\\d{10}$", "" ], "message": "String does not match pattern ^\\d{10}$: ", "path": "#/" },
  • 我创建了自己的 stringWidget,它覆盖了标准 stringWidget,但我不确定如何解决架构错误验证和向这个覆盖模板发送消息的问题。
  • @Jean-pauldeBeer 你解决了吗?

标签: angular forms jsonschema


【解决方案1】:

您可以在您的应用中使用 FormsModule, ReactiveFormsModule 来执行此操作。

请按照此操作。

FormsModule, ReactiveFormsModule 导入到您的module.ts 文件中。

import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { emailRegexp, passwordRegexp } from '../../constants'; // if you have any email regex for validation otherwise remove it.

添加到@NgModule:

@NgModule({
  imports: [
    BrowserModule,
    ReactiveFormsModule
  ],
  declarations: [
        AppComponent
  ],
})
export class AppModule {
}

现在转到表单需要验证的组件:

import { FormBuilder, FormGroup, Validators, NgForm } from '@angular/forms';

在您的构造函数中初始化:

   constructor(
        private formBuilder: FormBuilder,
    ) { }

创建您的表单验证器:(我用于登录目的):

    // login form validations
    this.loginForm = this.formBuilder.group({
        email: ['', Validators.compose([Validators.required)])], // If you don't have any email regex. otherwise write this=>             email: ['', Validators.compose([Validators.required, Validators.pattern(emailRegexp)])],

        password: ['', Validators.compose([Validators.required, Validators.minLength(8)])]
    });
}

现在像这样创建您的表单(在 HTML 中):

    <form [formGroup]="loginForm" (ngSubmit)="loginForm.valid && login()" novalidate>
              <div *ngIf="loginError" class="form-group">
                  <div class="">
                    <p class="loginError">Incorrect Email/Password </p>
                  </div>

              <input type="email"  formControlName="email">

            <p *ngIf="loginForm.controls.email.touched && loginForm.controls.email.errors && loginForm.controls.email.errors.pattern"
              class="error-message">
              Invalid Email </p>

            <p *ngIf=" loginForm.controls.email.touched && loginForm.controls.email.errors && loginForm.controls.email.errors.required && !loginForm.controls.email.errors.pattern"
              class="error-message">
              Email is required </p>
          </div>

      <div class="form-group row">
        <div class="col-12">
          <input autocomplete="off" type="password" (focus)="focusFunction()" placeholder="Password" formControlName="password" class="form-control">
        </div>
        <div *ngIf="loginForm.controls.password.touched">
          <p *ngIf="loginForm.controls.password.errors && loginForm.controls.password.errors.required " class="error-message">Password is required </p>
          <p *ngIf=" loginForm.controls.password.errors && loginForm.controls.password.errors.minlength" class="error-message"> Min. 8 characters required.</p>
        </div>
      </div>

      <div class="form-group row">
        <div class="col-12">
          <button [disabled]="!loginForm.valid" type="submit" >
          <div  class="sign-in">Sign in</div>
          </button>
        </div>
      </div>
</form>

【讨论】:

  • 感谢您,但这只是带有验证的标准表单(我知道该怎么做),但与我的问题无关,特别是使用 NGX-FROM-SCHEMA 从 json 动态生成表单并覆盖 ngx -schema-form 字符串小部件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 2017-05-30
  • 2021-10-20
  • 1970-01-01
相关资源
最近更新 更多