ngx-schema-form:添加自定义验证消息(Angular 6)?

Jea*_*eer 5 forms jsonschema angular

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

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

以下是标准模式格式的示例:

注意: 模式、最小长度、最大长度

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

但我想做的是:

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'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

然后,如果表单和字段是 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>
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个可靠的解决方案来进行企业级实施。

Shu*_*rma -2

您可以在您的应用程序中使用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.
Run Code Online (Sandbox Code Playgroud)

添加到@NgModule:

@NgModule({
  imports: [
    BrowserModule,
    ReactiveFormsModule
  ],
  declarations: [
        AppComponent
  ],
})
export class AppModule {
}
Run Code Online (Sandbox Code Playgroud)

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

import { FormBuilder, FormGroup, Validators, NgForm } from '@angular/forms';
Run Code Online (Sandbox Code Playgroud)

在构造函数中初始化:

   constructor(
        private formBuilder: FormBuilder,
    ) { }
Run Code Online (Sandbox Code Playgroud)

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

    // 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)])]
    });
}
Run Code Online (Sandbox Code Playgroud)

现在创建您的表单(在 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>
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你,但这只是带有验证的标准表单(我知道怎么做),但与我的问题无关,特别是使用 NGX-FROM-SCHEMA 从 json 动态生成表单并覆盖 ngx-schema-form 字符串小部件。 (3认同)