瞄准
动态生成表单输入的验证
Reactive
或
Template
接近。
解决方案
Directive
将是最好的使用这样的要求。
指令
有助于把复杂的工作分解成独立的小任务。让我们看看如何实现它。
下面提供的实现不需要对现有代码进行任何更改。
1。验证服务
import { Injectable } from '@angular/core';
@Injectable()
export class ValidateService {
errors = {};
validate(key: string, value: object) {
this.errors[key] = value;
}
getErrors() {
let errorList = [];
Object.keys(this.errors).forEach(key => {
let value = this.errors[key];
if ((value == undefined || value == '') && this.required.find(item=>item == key)) {
errorList.push({ name: key, error: key + " Field is required" })
}
});
return errorList;
}
//All required fields can be maintained here
required = [
"host",
"quantity",
"id"
]
}
2。验证指令
ValidateDirective
负责收集
input
控制是否发生任何更改。此信息将传递给服务类
ValidationService
.
import { Directive, Host, Input, OnChanges, SimpleChanges, ViewContainerRef, AfterViewInit } from '@angular/core';
import { ValidateService } from './validate.service';
@Directive({
selector: '[validate]'
})
export class ValidateDirective implements OnChanges {
constructor(private service: ValidateService, private containerRef: ViewContainerRef) {
}
@Input("ngModel") model;
@Input("validate") element;
ngOnChanges(changes: SimpleChanges) {
setTimeout(() => {
this.service.validate(this.containerRef.element.nativeElement.id, changes.model.currentValue);
})
}
}
三。指令用法
验证指令
可与任何输入控件一起使用
id
和
ngModel
.
前任:
<input [validate] id="{{prop.name}}" type="{{prop.details.type}}" [(ngModel)]="Edit[prop.name]" (ngModelChange)="Edit($event)" style=" border-radius:0;" class="form-control">
4。组件ts
ValidateService
将被注入到组件中以获取错误列表。
constructor(private service:ValidateService) {}
public get errors(){
return this.service.getErrors();
}
5。显示错误
由于组件中存在所有错误,因此可以在HTML中显示。
前任:
<li *ngFor="let error of errors">
{{error.error}}
</li>
注意-有很多东西可以进一步增强,比如
-
将自定义消息传递到
指令
.
-
Required field list
可以作为@input传递给指令
工作示例演示在这里-
https://stackblitz.com/edit/angular-xnbzqd