Angular 5 - Reactive Forms

回眸只為那壹抹淺笑 提交于 2019-12-06 15:49:17

You can subscribe to specific form control rather than the entier form lie this way

this.form.get('userName').valueChanges(value=> console.log('name change',value))

you can manage subscribe to form controls dynamically like this

this.form = fb.group({
  name: [],
  age: [],
  address: [],
});

Object.keys(this.form.controls).forEach(key  => {
  this.form.get(key).valueChanges.subscribe(value =>{
    console.log(`control ${key} has change =>` ,value)
  })
});

stackblitz demo 🚀🚀

you can still use form valueChanges pipe with pairwise operator to get the previous and current value and by compare both values you can get the the controls that changes

constructor(private fb: FormBuilder) {
    this.form = fb.group({
      name: [],
      age: [],
      address: [],
    });

    this.form.valueChanges.
       pipe(debounceTime(2000) ,startWith(null), pairwise()).  
       subscribe(([prev, next]) => {
        if (prev === null) { // 👈 run only first time 
          console.log(this.getValue(next))
        } else { // 🚨 compare values
          const result = {};
          const keys = Object.keys(next);

          keys.forEach(key => {
            if (prev[key] !== next[key]) {
              result[key] = next[key]
            }
          });
          console.log(result) ; // 🔵 the value that has changed 
        }
      })
  }

  // 👇👇 
  // for the first time all form controls are null 
  // so this mwthos get the value of object taht has a value 
  getValue(obj) {
    return Object.keys(obj).reduce((prev: any, key) => {
      if (obj[key]) {
        prev[key] = obj[key];
      };
      return prev;
    }, {})
  } 

stackblitz demo 🔥🔥

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!