Angular 2仅获取控制组中的脏值

问题描述 投票:2回答:2

我在Angular 2中有一个与自定义ControlGroup一起使用的表单。目前,当我提交表单时,我将以下行的所有数据传递给我的控制器。

(ngSubmit)="updateArtist(artistDetailForm.value)"

问题是,这传递了一个表单的所有值,如果我的表单非常大,这感觉很无用。是否有可能只传递修改后的(脏?)值?

angular angular2-forms
2个回答
3
投票

随着Angular Forms的新变化,我稍微修改了接受的答案,因此它可以正常工作。如果有人有兴趣,决定分享。 (使用Angular 4+)

getDirtyValues(form: any) {
        let dirtyValues = {};

        Object.keys(form.controls)
            .forEach(key => {
                const currentControl = form.controls[key];

                if (currentControl.dirty) {
                    if (currentControl.controls)
                        dirtyValues[key] = this.getDirtyValues(currentControl);
                    else
                        dirtyValues[key] = currentControl.value;
                }
            });

        return dirtyValues;
}

5
投票

声明你的表格。

this.artistDetailForm= formBuilder.group({......});

定义一个函数来提取提交值

// feed me controlGroups

getDirtyValues(cg) {
  let dirtyValues = {};  // initialize empty object
  Object.keys(cg.controls).forEach((c) => {

     let currentControl = cg.find(c);

     if(currentControl.dirty){
        if(currentControl.controls) //check for nested controlGroups
           dirtyValues[c] = getDirtyValues(currentControl);  //recursion for nested controlGroups
        else    
           dirtyValues[c] = currentControl.value;  //simple control
     }

    });
  return dirtyValues;
}

然后这样做

(ngSubmit)="updateArtist(getDirtyValues( artistDetailForm ))"

PLUNKER


2
投票

这是一个遍历任意Form结构的版本,并在嵌套的Map类结构中为您提供更改的值。这意味着返回的脏值将与脏控件处于同一级别。

getDirtyValues(
  form: FormGroup | FormArray | FormControl | AbstractControl
): Map<string, any> | any[] | any | undefined {
  if (!form.dirty) {
    return;
  }

  if (form instanceof FormControl) {
    return form.value;
  }

  if (form instanceof FormGroup) {
    const result = new Map();
    for (const [key, control] of Object.entries(form.controls)) {
      const nestedResult = this.getDirtyValues(control);
      if (nestedResult) {
        result.set(key, this.getDirtyValues(control));
      }
    }

    return result;
  }

  if (form instanceof FormArray) {
    const result = new Array();
    form.controls.forEach(control => {
      const nestedResult = this.getDirtyValues(control);
      if (nestedResult) {
        result.push(nestedResult);
      }
    });

    return result;
  }

  throw new Error('Form must be a FromGroup, FormArray or FormControl.');
}
© www.soinside.com 2019 - 2024. All rights reserved.