언제 FormGroup과 FormArray를 사용합니까?


91

FormGroup :

FormGroup는 키 각 컨트롤의 이름으로, 하나의 객체로 각 자식 FormControl의 값을 집계합니다.

const form = new FormGroup({
  first: new FormControl('Nancy', Validators.minLength(2)),
  last: new FormControl('Drew')
});

FormArray :

FormArray는 배열로 각 하위 FormControl의 값을 집계.

const arr = new FormArray([
  new FormControl('Nancy', Validators.minLength(2)),
  new FormControl('Drew')
]);

하나는 언제 다른 것보다 사용해야합니까?

답변:


122

FormArray는 FormGroup의 변형입니다. 주요 차이점은 데이터가 배열로 직렬화된다는 것입니다 (FormGroup의 경우 객체로 직렬화되는 것과 반대). 이것은 동적 양식과 같이 그룹 내에 얼마나 많은 컨트롤이 있을지 모르는 경우에 특히 유용 할 수 있습니다.

간단한 예를 들어 설명하겠습니다. 피자에 대한 고객의 주문을 캡처하는 양식이 있습니다. 그리고 특별 요청을 추가하고 제거 할 수있는 버튼을 배치합니다. 다음은 구성 요소의 html 부분입니다.

<section>
  <p>Any special requests?</p>
  <ul formArrayName="specialRequests">
    <li *ngFor="let item of orderForm.controls.specialRequests.controls; let i = index">
      <input type="text" formControlName="{{i}}">
      <button type="button" title="Remove Request" (click)="onRemoveSpecialRequest(i)">Remove</button>
    </li>
  </ul>
  <button type="button" (click)="onAddSpecialRequest()">
    Add a Request
  </button>
</section>

다음은 특수 요청을 정의하고 처리하는 구성 요소 클래스입니다.

constructor () {
  this.orderForm = new FormGroup({
    firstName: new FormControl('Nancy', Validators.minLength(2)),
    lastName: new FormControl('Drew'),
    specialRequests: new FormArray([
      new FormControl(null)
    ])
  });
}

onSubmitForm () {
  console.log(this.orderForm.value);
}

onAddSpecialRequest () {
  this.orderForm.controls
  .specialRequests.push(new FormControl(null));
}

onRemoveSpecialRequest (index) {
  this.orderForm.controls['specialRequests'].removeAt(index);
}

FormArray는 FormGroup의 "addControl", "removeControl", "setValue"등을 사용하는 것보다 "push", "insert"및 "removeAt"을 사용하여 FormControls를 조작하는 것이 더 쉽다는 점에서 FormGroup보다 더 많은 유연성을 제공합니다. FormArray 메서드는 컨트롤이 양식의 계층 구조에서 제대로 추적됩니다.

도움이 되었기를 바랍니다.


4
양식을 편집하려는 경우 어떻게합니까? 컨트롤을 어떻게 반복하고 추가합니까?
ctilley79

1
이것을 구성 요소로 어떻게 리팩토링 하시겠습니까?
Justin

키 : 값이있는 개체를 값 대신 양식 배열에 추가 할 수 있습니까?
Anthony

양식 레이블 이름을 어떻게 설정할 수 있습니까? 폼 컨트롤이 초기화되는 동안 설정할 수있는 옵션이 있습니까? 동적 형태이기 때문에 그 값을 설정할 수 없었습니다.
Krishnadas PC

29

반응 형을 만들려면 부모 FormGroup가 필수입니다. 여기 FormGroup에는 formControls, child formGroups또는formArray

FormArrayformControls또는 formGroup자체의 배열을 더 포함 할 수 있습니다 .

언제 formArray를 사용해야합니까?

사용법을 설명하는 이 아름다운 게시물 을 읽으십시오.formArray

그 블로그의 흥미로운 예는 여행에 관한 것입니다. formGroup

and를 formGroup사용 하는 여행의 구조는 다음과 같습니다.formControlformArray

this.tripForm = this.fb.group({
    name: [name, Validators.required],
     cities: new FormArray(
       [0] ---> new FormGroup({
           name: new FormControl('', Validators.required),
               places: new FormArray(
                  [0]--> new FormGroup({
                      name: new FormControl('', Validators.required),
                         }),
                      [1]--> new FormGroup({
                         name: new FormControl('', Validators.required),
                      })
                  )
              }), 
       [1] ---> new FormGroup({
           name: new FormControl('', Validators.required),
           places: new FormArray(
               [0]--> new FormGroup({
                   name: new FormControl('', Validators.required),
               }),
               [1]--> new FormGroup({
                   name: new FormControl('', Validators.required),
               })
               )
      }))
})

이 플레이하는 것을 잊지 마세요 DEMO 및 위해 배열의 사용을주의 cities하고 places여행의.


짧고 달콤한 설명.
Kanchan 2019-04-24

놀라운 설명
Taoufik Jabbari

훌륭한 형제.
jalpa

@scopchanov 텍스트에 대한 설명이 많지 않을 수도 있지만 양식 구조 표현은 약간의 아이디어를 제공합니다. 답변을 개선하기 위해 추가 할 수있는 사항이 있으면 알려주세요. :)
Amit Chigadani

글쎄요, 누군가 "설명"이라고하면 정확히 볼 수있을 거에요. 내 모든 존경심으로, 귀하의 답변은 SO 정의에 따라 "링크 전용 답변"에 매우 가깝습니다. 왜냐하면 그것이 요점에 도달하는 바로 그 지점, 즉 언제 formArray를 사용해야합니까? 에서는 중요한 부분을 인용하지 않고 블로그 게시물에 대한 링크가 제공됩니다. 실제로 일부 코드를 게시했지만 설명이 전혀 없습니다. 이 블로그 게시물에서 두 규칙을 모두 인용했다면 큰 차이를 만들었을 것입니다.
scopchanov

5

출처 : Anton Moiseev Book "Angular Development with Typescript, Second Edition" :

당신이해야 할 경우 프로그램 추가 (또는 삭제) 컨트롤을 A와 형태 , 사용 FormArray을 . FormGroup 과 유사 하지만 길이 변수가 있습니다. 반면 FormGroup가 나타냅니다 전체 양식 또는 양식의 필드의 고정 부분 집합을 , FormArray은 일반적으로 표현 성장 또는 축소 할 수 폼 컨트롤의 모음 .

예를 들어 FormArray 를 사용하여 사용자가 임의의 수의 이메일을 입력하도록 허용 할 수 있습니다 .


0

각도 문서에서 볼 수 있습니다.

FormArray는 명명되지 않은 컨트롤을 관리하기위한 FormGroup의 대안입니다. 양식 그룹 인스턴스와 마찬가지로 양식 배열 인스턴스에서 컨트롤을 동적으로 삽입 및 제거 할 수 있으며 양식 배열 인스턴스 값과 유효성 검사 상태는 자식 컨트롤에서 계산됩니다. 그러나 각 컨트롤에 대해 이름으로 키를 정의 할 필요가 없으므로 사전에 자식 값의 수를 모르는 경우 좋은 옵션입니다.

그들의 예를 보여 드리고 제가 이것을 어떻게 이해하는지 설명해 드리겠습니다. 여기에서 소스를 볼 수 있습니다.

양식 마녀가 다음 필드를 가지고 있다고 상상해보십시오.

  profileForm = this.fb.group({
    firstName: ['', Validators.required],
    lastName: [''],
    address: this.fb.group({
      street: [''],
      city: [''],
      state: [''],
      zip: ['']
    }),
    aliases: this.fb.array([
      this.fb.control('')
    ])
  });

여기 firstNamelastName, addressaliasesAll 필드가 함께 양식 그룹이므로 모든 것을 group. 동시에 address하위 그룹과 같으므로 다른 그룹으로 래핑합니다 group(더 나은 이해를 위해 템플릿을 볼 수 있습니다)! 여기에서 모든 폼 컨트롤은 key제외 aliases하고 .NET 과 같은 formBuilder메서드를 사용하여 간단한 배열처럼 원하는만큼 값을 넣을 수 있음을 의미합니다 push.

이것이 내가 그것을 이해하는 방법이며 누군가에게 도움이되기를 바랍니다.

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