formGroup의 Angular2 설정 값


91

따라서 엔터티를 만들기위한 복잡한 양식이 있고이를 편집에도 사용하고 싶습니다. 새로운 각도 양식 API를 사용하고 있습니다. 데이터베이스에서 검색 한 데이터와 똑같이 양식을 구조화 했으므로 전체 양식의 값을 여기에서 검색 한 데이터로 설정하고 싶습니다.

this.form = builder.group({
      b : [ "", Validators.required ],
      c : [ "", Validators.required ],
      d : [ "" ],
      e : [ [] ],
      f : [ "" ]
    });
this.form.value({b:"data",c:"data",d:"data",e:["data1","data2"],f:data});

추신 : NgModel은 새로운 양식 API에서 작동하지 않습니다. 또한 템플릿에서 단방향 데이터 바인딩을 사용하는 것도 괜찮습니다.

<input formControlName="d" value="[data.d]" />

작동하지만 어레이의 경우 고통이 될 것입니다.


내가 아는 한 양식 값 설정은 현재 지원되지 않으며 다음 업데이트 (RC.5) 이후에 지원됩니다. Plunker를 제공하십시오.
Günter Zöchbauer

@ GünterZöchbauer 내 현재 솔루션 확인
Amgad Serry

Di 당신은 github.com/angular/angular/blob/2.0.0-rc.5/modules/%40angular/… line 553 FormGroup.setValue ()?
Clement

답변:


298

모든 FormGroup 값 을 설정하려면 setValue를 사용하십시오 .

this.myFormGroup.setValue({
  formControlName1: myValue1, 
  formControlName2: myValue2
});

일부 값만 설정하려면 patchValue를 사용 하십시오 .

this.myFormGroup.patchValue({
  formControlName1: myValue1, 
  // formControlName2: myValue2 (can be omitted)
});

이 두 번째 기술을 사용하면 모든 값을 제공 할 필요가 없으며 값이 설정되지 않은 필드는 영향을받지 않습니다.


1
중첩 된 양식에서 patchValue를 사용하고 있으며 양식의 모든 필드를 덮어 씁니다. (내가 지정하지 않은 것조차도) 내가 뭘 잘못하고 있는지 아십니까?
Enrico

9

컨트롤이 FormGroup 일 때 설정 값에 대해이 예제를 사용할 수 있습니다.

this.clientForm.controls['location'].setValue({
      latitude: position.coords.latitude,
      longitude: position.coords.longitude
    });

5

예, setValue를 사용하여 편집 / 업데이트 목적으로 값을 설정할 수 있습니다.

this.personalform.setValue({
      name: items.name,
      address: {
        city: items.address.city,
        country: items.address.country
      }
    });

http://musttoknow.com/use-angular-reactive-form-addinsert-update-data-using-setvalue-setpatch/ 를 참조 하여 setValue를 사용하여 기능을 추가 / 편집하기 위해 반응 형 양식을 사용하는 방법을 이해할 수 있습니다 . 그것은 내 시간을 절약했습니다


5

form.get을 사용하여 특정 제어 객체를 가져오고 setValue를 사용할 수 있습니다.

this.form.get(<formControlName>).setValue(<newValue>);

3

의견에서 지적했듯이이 기능은이 질문을 받았을 당시 지원되지 않았습니다. 이 문제는 angular 2 rc5에서 해결되었습니다.


2

angular2가 updateValue 양식을 지원할 때까지 임시 솔루션을 구현했습니다.

 initFormGroup(form: FormGroup, data: any) {
        for(var key in form.controls) {
          console.log(key);
          if(form.controls[key] instanceof FormControl) {
            if(data[key]){
              let control = <FormControl>form.controls[key];
              this.initFormControl(control,data[key]);
            }
          } else if(form.controls[key] instanceof FormGroup) {
            if(data[key]){
              this.initFormGroup(<FormGroup>form.controls[key],data[key]);
            }
          } else if(form.controls[key] instanceof FormArray) {
            var control = <FormArray>form.controls[key];
            if(data[key])
            this.initFormArray(control, data[key]);
          }
        }
      }
      initFormArray(array: FormArray, data: Array<any>){
    if(data.length>0){
      var clone = array.controls[0];
      array.removeAt(0);
      for(var idx in data) {
        array.push(_.cloneDeep(clone));
        if(clone instanceof FormGroup)
          this.initFormGroup(<FormGroup>array.controls[idx], data[idx]);
        else if(clone instanceof FormControl)
          this.initFormControl(<FormControl>array.controls[idx], data[idx]);
        else if(clone instanceof FormArray)
          this.initFormArray(<FormArray>array.controls[idx], data[idx]);
      }
    }
  }


initFormControl(control: FormControl, value:any){
    control.updateValue(value);
  }

용법:

this.initFormGroup(this.form, {b:"data",c:"data",d:"data",e:["data1","data2"],f:data});

참고 : 양식과 데이터는 동일한 구조를 가져야하며 jQuery를 딥 클로닝하는 데 lodash를 사용했으며 다른 lib도 할 수 있습니다.


0

"NgModel은 새 양식 API에서 작동하지 않습니다."

그건 사실이 아니야. 올바르게 사용하기 만하면됩니다. 반응 형을 사용하는 경우 NgModel은 반응 지시문 과 함께 사용해야합니다 . 소스의 예를 참조하십시오 .

/*
 * @Component({
 *      selector: "login-comp",
 *      directives: [REACTIVE_FORM_DIRECTIVES],
 *      template: `
 *        <form [formGroup]="myForm" (submit)='onLogIn()'>
 *          Login <input type='text' formControlName='login' [(ngModel)]="credentials.login">
 *          Password <input type='password' formControlName='password'
 *                          [(ngModel)]="credentials.password">
 *          <button type='submit'>Log in!</button>
 *        </form>
 *      `})
 * class LoginComp {
 *  credentials: {login:string, password:string};
 *  myForm = new FormGroup({
 *    login: new Control(this.credentials.login),
 *    password: new Control(this.credentials.password)
 *  });
 *
 *  onLogIn(): void {
 *    // this.credentials.login === "some login"
 *    // this.credentials.password === "some password"
 *  }
 * }
 */

TODO 주석 에서처럼 보이지만 제거되고 반응 형 API로 대체 될 수 있습니다.

// TODO(kara):  Replace ngModel with reactive API
@Input('ngModel') model: any;

angular2 api docs NgModel selector [ngModel] : not ([formControlName]) : not ([formControl]) angular.io/docs/ts/latest/api/forms/index/…에서 온 것이므로 지금 작동하더라도 나중에 제거 내가 그것을보다 안정적인 솔루션이 될 것 같은 내가 수동 값 인젝터를 구현하는 것이라고 생각
Amgad Serry

@AmgadSerry는 (선택기에서) 해당 구성 요소를 방해하지 않는지 확인하는 것입니다. 는이를 FormControlName명시 적으로 @Input(). 내가 링크 한 소스를 참조하십시오. 이러한 부정 선택자가 없으면 위의 예를 사용하여 원하지 않는 NgModel이 생성됩니다.
Paul Samsotha

약간 혼란 스럽지만 이것이 구현 된 방식입니다. FormControlDirective( [formControl])와 FormControlName( formControlName) 모두 이것이 작동하는 방식입니다. 이 ngModel중 하나없이 사용되는 경우 선언적 형식을 사용하는 것으로 가정하고이 NgModel생성됩니다. 는 IF ngModel사용 과 함께 중 하나 반응 양식을 지시하고 있다는 반응 형태 지시자는 모델이 아닌 처리 할 수NgModel
폴 Samsotha

오 나는 그들이 만든 생각이 해킹은 당분간 두 지시에 ngModel을 가능하게하고 나중에 제거로
Amgad Serry

내 현재 솔루션 확인
Amgad Serry
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.