首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反应形态改变角2

反应形态改变角2
EN

Stack Overflow用户
提问于 2017-06-28 01:12:53
回答 2查看 1.9K关注 0票数 2

我有一个要检测更改的反应性表单。例如,当用户查看产品时,会打开一个“查看产品”页面,在所有表单字段中填写该产品的详细信息。如果对表单中的任何值进行了更改,我希望启用"Save“按钮(默认情况下是禁用的)。但是,如果用户取消更改或恢复到加载时的状态,则将再次禁用Save按钮。

这个是可能的吗?我见过一些人用角度检测形状的变化,使表单变得“脏”,但一旦表单被污染,就不容易或直观地将状态变为原始状态。我还阅读了人们将初始产品详细信息加载到本地存储中的位置,并将当前状态的表单值JSON与本地存储JSON进行比较,并在此基础上启用/禁用按钮。有没有人喜欢或更好的方法?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-28 01:59:47

当初始数据到达时,将其本地保存为组件属性。然后,您可以随时将其与表单的当前值进行比较,以确定是否发生了更改。

你需要:

  • initValues,起始表单值(在用户交互之前)
  • disableSaveBtn:boolean属性,该属性与:[disabled]="disableSaveBtn"绑定到模板中的按钮。
  • valuesMatch(val1,val2):boolean函数,它将比较表单的两个模型,如果它们匹配,则返回true

每次表单值更改时进行比较。由于您使用的是反应性表单,所以您只需听一听可观察到的valueChanges

代码语言:javascript
复制
// will emit every time a form control value is changed
this.form.valueChanges.subscribe(newValues => {
    // disable the button if new value matches initial value
    this.disableSaveBtn = this.valuesMatch(newValues, initValues)
})
票数 4
EN

Stack Overflow用户

发布于 2020-05-12 16:28:07

基于BeetleJuice提到的内容:

找出什么是脏的: JSON比较适用于深嵌套的对象,而且由于浏览器需要观察的所有可观察性,因此比单独跟踪所有表单控件花费更少。

代码语言:javascript
复制
  patchValueLocation(yourFormValues){
    this.form.patchValue(yourFormValues);
    this.createReference(this.formGroup.value)
    this.loading = false;
  }

  private createReference(obj: any){
    this.reference = JSON.stringify(obj)
  }

  ngOnInit() {
    this.form.valueChanges.subscribe(newValues=> {
      if(!this.loading){
        const hasChanges = !( JSON.stringify(newValues) === this.reference );
        this.dirty = hasChanges;
      }
    })
  }

如本文档所示,您也可以侦听单个窗体控件。

https://alligator.io/angular/reactive-forms-valuechanges

代码语言:javascript
复制
ngOnInit(): void {
  this.myForm.get('name').valueChanges.subscribe(val => {
    this.formattedMessage = `My name is ${val}.`;
  });
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44792199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档