角反应形式值变化

时间:2019-10-25 12:48:17

标签: angular angular-reactive-forms angular-changedetection

我的student.component.ts中有一个下面的表单组:

        // Init locals
        this.studentFormGroup = this._fb.group({
            firstName            : ['N/A', {updateOn: 'change'}],
            lastName             : ['N/A', {updateOn: 'change'}],
            address              : ['N/A', {updateOn: 'change'}],
            phone                : ['N/A', {updateOn: 'change'}],
            gender               : ['N/A', {updateOn: 'change'}],
            email                : ['N/A', {updateOn: 'change'}],
            city                 : ['N/A', {updateOn: 'change'}],
            country              : ['N/A', {updateOn: 'change'}],
        });

每次控制值更改时,我都会调用webapi并使用以下方式将其保存到数据库中。 但是,尽管用户更改了值,但我不想在性别字段上调用webapi。

this.studentFormGroup.valueChanges.subscribe(() => this.saveStudentRecord());

这里是问题,上面的单行代码在每次控制值更改时调用 saveStudentRecord

但是正如我提到的那样,我不需要呼吁性别控制。

所以目前我确实按照以下方法更改每个控件的值

this.studentFormGroup.get('firstName').valueChanges.subscribe(() => this.saveStudentRecord());
this.studentFormGroup.get('lastName').valueChanges.subscribe(() => this.saveStudentRecord());
this.studentFormGroup.get('address').valueChanges.subscribe(() => this.saveStudentRecord());
..
..
and so on except **gender** field

但是有时候,如果我在一个页面中有更多控件,则必须编写许多语句以忽略一个字段。

是否可以通过以下方式忽略性别控制值的变化?

this.studentFormGroup.valueChanges.subscribe(() => this.saveStudentRecord());

2 个答案:

答案 0 :(得分:2)

这是小菜一碟...了解rxjs和可管道运算符。 (代码未经测试)

this.studentFormGroup.valueChanges.pipe(
  distinctUntilChanged((prev, curr) => prev.gender !== curr.gender)), // don't emit value if gender changed
  debounceTime(500), // allow time between keystrokes (computers are too fast sometimes)
  takeUntil(this.destroyed$)
).subscribe(() => this.saveStudentRecord());

答案 1 :(得分:0)

您可以遍历Object.keys()中的键(使用this.studentFormGroup.controls),并在每个控件上为性别控件调用valueChanges.subscribe()