[forms] FormBuilder 컨트롤의 값을 수동으로 설정

이것은 나를 미치게 만들고 있습니다. 나는 총을 받고 있으며 하루 종일 이것에 대해 여유를 가질 수 없습니다.

구성 요소 내에서 수동으로 제어 값 ( ‘dept’)을 설정하려고하는데 작동하지 않습니다. 새로운 값조차도 콘솔에 올바르게 기록됩니다.

FormBuilder 인스턴스는 다음과 같습니다.

initForm() {
  this.form = this.fb.group({
    'name': ['', Validators.required],
    'dept': ['', Validators.required],
    'description': ['', Validators.required],
  });
}

선택한 부서를 수신하는 이벤트 핸들러입니다.

deptSelected(selected: { id: string; text: string }) {
  console.log(selected) // Shows proper selection!

  // This is how I am trying to set the value
  this.form.controls['dept'].value = selected.id;
}

이제 양식을 제출하고 로그 아웃 this.form하면 필드가 여전히 비어 있습니다! 다른 ppl 사용을 updateValue()보았지만 이것은 베타 1이며 컨트롤을 호출하는 유효한 방법으로 보지 못합니다.

나는 또한 updateValueAndValidity()성공하지 않고 전화 를 시도했다 :(.

ngControl="dept"양식의 나머지 부분을 사용하지만 사용자 지정 지시문 / 구성 요소를 사용 하는 것처럼 양식 요소에 사용 하려고합니다.

<ng-select
  [data]="dept"
  [multiple]="false"
  [items]="depts"
  (selected)="deptSelected($event)" <!-- This is how the value gets to me -->
  [placeholder]="'No Dept Selected'"></ng-select>



답변

업데이트 날짜 : 19/03/2017

this.form.controls['dept'].setValue(selected.id);

낡은:

지금은 타입 캐스트를해야합니다 :

(<Control>this.form.controls['dept']).updateValue(selected.id)

매우 우아하지 않습니다. 향후 버전에서 이것이 개선되기를 바랍니다.


답변

RC5 + (Angular 2 Final)에는 양식 값을 업데이트하기위한 새로운 API가 있습니다. patchValue()API 방법은 우리가 단지 일부 필드를 지정해야 부분적인 형태로 업데이트를 지원합니다 :

this.form.patchValue({id: selected.id})

setValue()모든 양식 필드가있는 객체가 필요한 API 메소드 도 있습니다. 누락 된 필드가 있으면 오류가 발생합니다.


답변

Aangular 2 final은 API를 업데이트했습니다. 그들은 이것을 위해 많은 방법을 추가했습니다.

컨트롤러에서 폼 컨트롤을 업데이트하려면 다음과 같이하십시오 :

this.form.controls['dept'].setValue(selected.id);

this.form.controls['dept'].patchValue(selected.id);

오류를 재설정 할 필요가 없습니다

참고 문헌

https://angular.io/docs/ts/latest/api/forms/index/FormControl-class.html

https://toddmotto.com/angular-2-form-controls-patch-value-set-value


답변

다음 방법을 사용하여 반응 형 컨트롤의 값을 업데이트 할 수 있습니다. 다음 방법 중 하나가 필요에 적합합니다.

setValue ()를 사용하는 메소드

this.form.get("dept").setValue(selected.id);
this.form.controls["dept"].setValue(selected.id);

patchValue ()를 사용하는 메소드

this.form.get("dept").patchValue(selected.id);
this.form.controls['dept'].patchValue(selected.id);
this.form.patchValue({"dept": selected.id});

마지막 방법은 양식의 모든 컨트롤을 철저히 반복하므로 단일 컨트롤을 업데이트 할 때는 바람직하지 않습니다

이벤트 핸들러 내부의 모든 메소드를 사용할 수 있습니다

deptSelected(selected: { id: string; text: string }) {
     // any of the above method can be added here
}

필요한 경우 양식 그룹에서 여러 컨트롤을 업데이트 할 수 있습니다.

this.form.patchValue({"dept": selected.id, "description":"description value"});


답변

당신은 이것을 시도 할 수 있습니다 :

deptSelected(selected: { id: string; text: string }) {
  console.log(selected) // Shows proper selection!

  // This is how I am trying to set the value
  this.form.controls['dept'].updateValue(selected.id);
}

자세한 내용은 https://github.com/angular/angular/blob/master/modules/angular2/src/common/forms/modelupdateValue 메소드 의 두 번째 매개 변수와 관련된 해당 JS Doc을 참조하십시오. ts # L269 .


답변

이 중 어느 것도 나를 위해 일하지 않았습니다. 나는해야했다 :

  this.myForm.get('myVal').setValue(val);


답변

  let cloneObj = Object.assign({}, this.form.getRawValue(), someClass);
  this.form.complexForm.patchValue(cloneObj);

각 필드를 수동으로 설정하지 않으려면