Angular 5 表单验证。检查现有单词
Angular 5 form validation. to check existing word
我有一个只有一个输入的简单表格。
我需要检查用户是否输入了现有单词。
如果用户输入单词,我想在输入字段下方显示一条消息,如 "This word already exists!"。最好不要使用反应形式
感谢任何支持
import { Component, Inject } from "@angular/core";
import { FormBuilder, FormGroup } from "@angular/forms";
import { MatDialogRef, MAT_DIALOG_DATA } from "@angular/material";
@Component({
selector: "app-tag-dialog",
templateUrl: "./tag-dialog.component.html",
styleUrls: ["../../styles/dialog.scss"]
})
export class TagDialogComponent {
form: FormGroup;
constructor(
private formBuilder: FormBuilder,
private matDialogRef: MatDialogRef<TagDialogComponent>,
@Inject(MAT_DIALOG_DATA) public data: any
) {
this.createForm();
}
createForm() {
this.form = this.formBuilder.group({ tag: "" });
}
submit(form: any) {
this.matDialogRef.close(form.value);
}
}
<div class="dialog mat-typography">
<h1 mat-dialog-title>{{ data.action }} tag</h1>
<form [formGroup]="form" (ngSubmit)="submit(form)">
<div mat-dialog-content>
<div class="dialog__row">
<mat-form-field class="dialog__input">
<input matInput placeholder="Tag" formControlName="tag" required>
<mat-error *ngIf="form.controls.tag.invalid">Tag is required</mat-error>
<mat-error *ngIf=".............">This word already exists</mat-error>
</mat-form-field>
</div>
</div>
<div mat-dialog-actions class="dialog__row dialog__row--actions">
<button mat-button type="reset" color="primary" mat-dialog-close>CANCEL</button>
<button mat-button type="submit" color="primary" [disabled]="!form.valid">OK</button>
</div>
</form>
</div>
tags.validator.ts
import { Directive, Input } from '@angular/core';
import { NG_VALIDATORS, Validator, FormControl } from '@angular/forms';
@Directive({
selector: '[tagValidator]',
providers: [{
provide: NG_VALIDATORS,
useExisting: TagsValidator,
multi: true
}]
})
export class TagsValidator implements Validator {
@Input('tagValidator') tags: string[];
validate(control: FormControl) {
const hasTag = this.tags.indexOf(control.value) > -1;
return hasTag
? { duplicateTags: true }
: null;
}
}
用法示例:
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
template: `
<input [(ngModel)]="tag" [tagValidator]="existingTags" #dir="ngModel" />
<div> Valid: {{ dir.valid }} </div>
<div> Existing tags: {{ existingTags | json }} </div>
`,
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
tag = 'hello';
existingTags = ['hello', 'world'];
}
我有一个只有一个输入的简单表格。
我需要检查用户是否输入了现有单词。
如果用户输入单词,我想在输入字段下方显示一条消息,如 "This word already exists!"。最好不要使用反应形式
感谢任何支持
import { Component, Inject } from "@angular/core";
import { FormBuilder, FormGroup } from "@angular/forms";
import { MatDialogRef, MAT_DIALOG_DATA } from "@angular/material";
@Component({
selector: "app-tag-dialog",
templateUrl: "./tag-dialog.component.html",
styleUrls: ["../../styles/dialog.scss"]
})
export class TagDialogComponent {
form: FormGroup;
constructor(
private formBuilder: FormBuilder,
private matDialogRef: MatDialogRef<TagDialogComponent>,
@Inject(MAT_DIALOG_DATA) public data: any
) {
this.createForm();
}
createForm() {
this.form = this.formBuilder.group({ tag: "" });
}
submit(form: any) {
this.matDialogRef.close(form.value);
}
}
<div class="dialog mat-typography">
<h1 mat-dialog-title>{{ data.action }} tag</h1>
<form [formGroup]="form" (ngSubmit)="submit(form)">
<div mat-dialog-content>
<div class="dialog__row">
<mat-form-field class="dialog__input">
<input matInput placeholder="Tag" formControlName="tag" required>
<mat-error *ngIf="form.controls.tag.invalid">Tag is required</mat-error>
<mat-error *ngIf=".............">This word already exists</mat-error>
</mat-form-field>
</div>
</div>
<div mat-dialog-actions class="dialog__row dialog__row--actions">
<button mat-button type="reset" color="primary" mat-dialog-close>CANCEL</button>
<button mat-button type="submit" color="primary" [disabled]="!form.valid">OK</button>
</div>
</form>
</div>
tags.validator.ts
import { Directive, Input } from '@angular/core';
import { NG_VALIDATORS, Validator, FormControl } from '@angular/forms';
@Directive({
selector: '[tagValidator]',
providers: [{
provide: NG_VALIDATORS,
useExisting: TagsValidator,
multi: true
}]
})
export class TagsValidator implements Validator {
@Input('tagValidator') tags: string[];
validate(control: FormControl) {
const hasTag = this.tags.indexOf(control.value) > -1;
return hasTag
? { duplicateTags: true }
: null;
}
}
用法示例:
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
template: `
<input [(ngModel)]="tag" [tagValidator]="existingTags" #dir="ngModel" />
<div> Valid: {{ dir.valid }} </div>
<div> Existing tags: {{ existingTags | json }} </div>
`,
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
tag = 'hello';
existingTags = ['hello', 'world'];
}