【发布时间】:2016-12-12 22:00:26
【问题描述】:
我试图找出为 ngModel 实现自定义验证器逻辑的最简单方法。我有一个存储当前数据的预定义模型(接口),所以我不想处理新的 FormGroup/FormControl(模型驱动)方法。
如果我已经拥有所需的所有数据,为什么还要使用 FormControls 构建完全相同的架构?
这是我的代码 (https://plnkr.co/edit/fPEdbMihRSVqQ5LZYBHO):
import { Component, Input } from '@angular/core';
export interface MyWidgetModel {
title:string;
description:string;
}
@Component({
selector: 'my-widget',
template: `
<h4 *ngIf="!editing">{{data.title}}</h4>
<input *ngIf="editing" type="text" name="title" [(ngModel)]="data.title">
<p *ngIf="!editing">{{data.description}}</p>
<textarea *ngIf="editing" name="description" [(ngModel)]="data.description" (ngModelChange)="customValidator($event)"></textarea>
<button (click)="clickEditing()">{{editing ? 'save' : 'edit'}}</button>
`
styles: [
':host, :host > * { display: block; margin: 5px; }',
':host { margin-bottom: 10px; padding-bottom: 10px; border-bottom: 1px solid #eee; }',
'.ng-invalid { background-color: #FEE; }'
]
})
export class MyWidgetComponent {
@Input() data:MyWidgetModel;
constructor() {
this.editing = false;
}
clickEditing() {
this.editing = !this.editing;
}
customValidator(value:string) {
console.log(this, value); //should be: MyWidgetComponent
//How to set 'invalid' state here?
}
}
如您所见,我可以快速打开/关闭编辑模式,并且可以直接就地编辑我的数据。
我的问题是如何直接从我的组件管理 ngModel 的 ng-valid/ng-invalid 状态?这背后的想法包括多点:
- 当数据模型已经存在时,我们为什么要为 FormGroups、FormControls 创建一个具有相同结构的新局部变量?
- 组件本身实现了所需的业务逻辑,因此所有业务规则验证器也必须在这里实现。
- 可能有许多复杂的验证逻辑。这些不能仅使用输入的纯文本值和简单的检查(如要求、长度、模式等)来实现。
- 由于以上所有,我认为我们最终需要我们的整个组件对象来解决所有实际的业务规则验证。
【问题讨论】:
标签: validation angular angular2-forms