Angular 2 Reactive Form - 仅当表单变脏时显示重置按钮
Angular 2 Reactive Form - Display a reset button only if form is dirty
我有一个反应式表单,我想显示一个重置按钮,它将表单值重置为初始值。
现在,只有在 表单脏了时才会显示按钮。
表单定义为:
this.form = new FormGroup({
firstName: new FormControl(''),
lastName: new FormControl('')
});
我尝试过的第一种方法是使用 Reactive 形式的 form.dirty
属性,但这不是我需要的。
form.dirty
returns true
用户在inputs中输入内容,然后删除,表单控件的值与initial相同的场景
第二种方法是保存初始值:this.initialFormValue = this.form.value;
,然后实现一个自定义函数,将当前表单值与初始值进行比较:
isFormDirty(): boolean {
return JSON.stringify(this.initialFormValue) !== JSON.stringify(this.form.value);
}
(比较不是很聪明,也许我会使用一些Lodash功能等,但这不是问题的重点)。
<div *ngIf="isFormDirty()" style="color: red;">Form is really dirty</div>
它有效,但是该函数被调用非常频繁(当 Angular 检测到更改或其他内容时),我认为我可能有一些性能问题。
我想我可能会使用 valueChanges
observable,并发出一个新值...
您还有其他建议吗?
堆栈闪电战:
https://stackblitz.com/edit/angular-jywynt
谢谢。
是的,您可以收听 valueChanges
Observable,您可以控制执行的频率,例如,您可以使用 debounceTime
来减少调用。
this.form.valueChanges
.pipe(debounceTime(50))
.subscribe(newValue => {
if (this.isFormDirty()) {
this.form.markAsDirty();
} else {
this.form.markAsPristine();
}
});
现在您可以简单地使用来自 FormGroup
对象的相同 属性 form.dirty
:
<div *ngIf="form.dirty" style="color: red;">Form is really dirty</div>
<div *ngIf="!form.dirty">Form is not dirty (values are identical to initial)</div>
我有一个反应式表单,我想显示一个重置按钮,它将表单值重置为初始值。
现在,只有在 表单脏了时才会显示按钮。
表单定义为:
this.form = new FormGroup({
firstName: new FormControl(''),
lastName: new FormControl('')
});
我尝试过的第一种方法是使用 Reactive 形式的 form.dirty
属性,但这不是我需要的。
form.dirty
returns true
用户在inputs中输入内容,然后删除,表单控件的值与initial相同的场景
第二种方法是保存初始值:this.initialFormValue = this.form.value;
,然后实现一个自定义函数,将当前表单值与初始值进行比较:
isFormDirty(): boolean {
return JSON.stringify(this.initialFormValue) !== JSON.stringify(this.form.value);
}
(比较不是很聪明,也许我会使用一些Lodash功能等,但这不是问题的重点)。
<div *ngIf="isFormDirty()" style="color: red;">Form is really dirty</div>
它有效,但是该函数被调用非常频繁(当 Angular 检测到更改或其他内容时),我认为我可能有一些性能问题。
我想我可能会使用 valueChanges
observable,并发出一个新值...
您还有其他建议吗?
堆栈闪电战: https://stackblitz.com/edit/angular-jywynt
谢谢。
是的,您可以收听 valueChanges
Observable,您可以控制执行的频率,例如,您可以使用 debounceTime
来减少调用。
this.form.valueChanges
.pipe(debounceTime(50))
.subscribe(newValue => {
if (this.isFormDirty()) {
this.form.markAsDirty();
} else {
this.form.markAsPristine();
}
});
现在您可以简单地使用来自 FormGroup
对象的相同 属性 form.dirty
:
<div *ngIf="form.dirty" style="color: red;">Form is really dirty</div>
<div *ngIf="!form.dirty">Form is not dirty (values are identical to initial)</div>