【发布时间】:2018-09-17 18:13:48
【问题描述】:
当我单击提交时,没有一个文本区域完成,我必须看到一个错误。当至少一个被填满时 - 我想呈现提交动作?我怎样才能以最好的方式做到这一点?
【问题讨论】:
-
开始使用响应式表单。
-
看看我的回答
标签: angular validation
当我单击提交时,没有一个文本区域完成,我必须看到一个错误。当至少一个被填满时 - 我想呈现提交动作?我怎样才能以最好的方式做到这一点?
【问题讨论】:
标签: angular validation
模板驱动方法:
<form #form="ngForm" (ngSubmit)="onSubmit(form.value)">
<div class="form-group">
<div class="row">
<div class="col-md-4" *ngFor="let t of textarea; let in=index">
<textarea class="form-control"
rows="5" [(ngModel)]="textarea[in].value"
[name]="'something' + in"
placeholder="Type..."></textarea>
</div>
<button (click)="add()">Add input</button>
<button type="submit" >Submit</button>
</div>
</div>
</form>
组件:
遍历对象以了解它是否为空。在 Group 表单上监听 valueChanges 事件并根据它采取行动。
export class AppComponent {
@ViewChild('form') myForm: NgForm;
textarea: { value: string }[];
isError: boolean = false;
constructor() {
this.textarea = [{ value: '' }, { value: '' }, { value: '' }];
}
add() {
this.textarea.push({ value: '' });
}
isEmpty(obj): boolean {
for (let key of Object.keys(obj)) {
if (obj.hasOwnProperty(key) && obj[key].length) {
return false;
}
}
return true;
}
ngAfterViewInit() {
this.myForm.valueChanges.subscribe(value => {
this.isError = false;
})
}
onSubmit(form) {
if (this.isEmpty(form)) {
this.isError = true;
} else {
this.isError = false;
}
}
}
【讨论】:
按照您的模式,您可以使用Array.every:
allEmpty() {
return this.textarea.every(t => t.value === '')
}
<button [disabled]="allEmpty()">Submit</button>
编辑:
<button (click)="onSubmit($event)">Submit</button>
<span *ngIf="allEmpty() && clicked">
error
</span>
clicked = false;
allEmpty() {
return this.textarea.every(t => t.value === '')
}
onSubmit(e) {
this.clicked = true;
if (this.allEmpty()) {
e.preventDefault();
}
}
【讨论】:
这里不是使用普通的旧 Javascript,而是使用 Angular 方式:表单组级别的自定义验证函数。
function atLeastOneTextarea(): ValidatorFn {
return (group: FormGroup): ValidationErrors => {
const hasAtLeastOneValue = Object.keys(group.value).some(key => !!group.value[key]);
return !hasAtLeastOneValue && { 'atLeastOne': true } || null;
};
}
验证器将测试表单的值是否具有至少一个真值。如果没有,它将显示错误。
我改用响应式表单是因为对于验证,当您是初学者时更好地理解它的工作原理。随意将其更改为您对模板驱动表单的需求,或保持原样。
【讨论】:
*ngIf,我只是用它来检查我的验证器是否工作(比写错误更快!)。模板驱动的表单可以查看the documentation,会比我解释的更好!