formControlName과 FormControl의 차이점은 무엇입니까?


99

내가 사용하고 ReactiveFormsModule양식을 포함하는 구성 요소를 만들 수 Angular2의. 내 코드는 다음과 같습니다.

foo.component.ts :

constructor(fb: FormBuilder) {
    this.myForm = fb.group({
        'fullname': ['', Validators.required],
        'gender': []
    });
}

foo.component.html (사용 [formControl]) :

<div class="fields">
    <div class="field">
        <label>Fullname*</label>
        <input type="text" [formControl]="myForm.controls.fullname"/>
    </div>
</div>

<div class="inline fields">
    <label for="gender">Gender</label>
    <div class="field">
        <div class="ui radio checkbox">
            <input type="radio" name="gender" checked="" tabindex="0" class="hidden" [formControl]="myForm.controls.gender">
            <label>Male</label>
        </div>
    </div>
    <div class="field">
        <div class="ui radio checkbox">
            <input type="radio" name="gender" tabindex="0" class="hidden" [formControl]="myForm.controls.gender">
            <label>Female</label>
        </div>
    </div>
</div>

foo.component.html (사용 formControlName) :

<div class="fields">
    <div class="field">
        <label>Fullname*</label>
        <input type="text" formControlName="fullname"/>
    </div>
</div>

<div class="inline fields">
    <label for="gender">Gender</label>
    <div class="field">
        <div class="ui radio checkbox">
            <input type="radio" name="gender" checked="" tabindex="0" class="hidden" formControlName="gender">
            <label>Male</label>
        </div>
    </div>
    <div class="field">
        <div class="ui radio checkbox">
            <input type="radio" name="gender" tabindex="0" class="hidden" formControlName="gender">
            <label>Female</label>
        </div>
    </div>
</div>

두 가지 방법 모두 작동합니다. 하지만 사용 [formControl]formControlName. 의 차이점을 파악할 수 없습니다 .


1
formControl보다 formControlName을 사용하는 주된 이유는 구성 요소에서 개별 FormControl 인스턴스를 유지하지 않으려는 경우입니다.
Paul Samsotha

답변:


179

[formGroup]두 번째 예의 지시문 이라는 중요한 점을 놓쳤다 고 생각합니다 . formControlName와 함께 사용 [formGroup]하여 양식을 여러 점 탐색으로 저장합니다. 예를 들면 :

<div>
  <input type="text" [formControl]="myForm.controls.firstName"/>
  <input type="text" [formControl]="myForm.controls.lastName"/>
  <input type="text" [formControl]="myForm.controls.email"/>
  <input type="text" [formControl]="myForm.controls.title"/>
</div>

다음과 같습니다.

<div [formGroup]="myForm">
  <input type="text" formControlName="firstName"/>
  <input type="text" formControlName="lastName"/>
  <input type="text" formControlName="email"/>
  <input type="text" formControlName="title"/>
</div>

이제 중첩을 상상해보십시오 FormGroups:)


이용하여 formControl] = "form.get ( 'Registration.Attributes.aboutme') '문제를 야기하지만 .. ="firstNRegistration.Attributes.aboutmeame "formControlName 미세 작동
리카르도 Saracino

[formControl]문제를 일으키는 동안 form.validformGroup, 의견과 검증
Pardeep 자이나교

입력 요소가 다른 구성 요소 인 경우 어떻게 처리 할 수 ​​있습니까? 어떻게 구성 요소 가지 fomrcontrol 결합 할
Ramakanth 레디를

20

[formControl]FormControl생성 한 인스턴스에 대한 참조를에 할당 합니다 FormControlDirective.

formControlName 이름으로 컨트롤을 조회하기 위해 양식 모듈에 대한 문자열을 할당합니다.

컨트롤에 대한 변수를 생성하는 경우 .Harry가 언급 한대로는 필요하지 않지만 , [formGroup]더 복잡한 형태의 경우 지저분해질 수 있으므로 대신 사용 하는 것이 좋습니다 .

constructor(fb: FormBuilder) {
    this.fullName = new FormControl('', Validators.required);
    this.gender = new FormControl('');
    this.myForm = fb.group({
        'fullname': this.fullName,
        'gender': this.gender
    });
}

this.fullName = new FormControl ( '', Validators.required); 읽기 전용 속성이거나 상수이기 때문에 할당 할 수 없다는 오류가 발생했습니다.하지만 여기서는 변수로 간주됩니다.
그래서

1
정확한 오류 메시지를 게시하십시오 . 그것은 재현 할 수 있도록 코드를 포함하는 새로운 질문을 만들 아마 더 나은
귄터 Zöchbauer

7

허용되는 답변에 제공된 두 가지 항목에 세 번째 등가가 있습니다 (권장되지 않음).

<div [formGroup]="myForm">
  <input type="text" [formControl]="firstName"/>
  <input type="text" [formControl]="lastName"/>
  <input type="text" [formControl]="email"/>
  <input type="text" [formControl]="title"/>
</div>

여전히 [formGroup] 지시문을 사용하고 있습니다.

그러나이 템플릿을 오류없이 컴파일하려면 구성 요소에서 컨트롤을 FormControls가 아닌 AbstractControls로 선언해야합니다.

myComponent.ts

firstName: AbstractControl
lastName: AbstractControl
email: AbstractControl
title: AbstractControl

그러나 AbstractControls 선언은 권장되지 않으므로 오류 Cannot find control with unspecified name attribute가 발생하면 스타일을 혼합했거나 컨트롤을 AbstractControls로 선언했을 가능성이 있습니다.


입력 요소가 다른 구성 요소 인 경우 어떻게 처리 할 수 ​​있습니까? 어떻게 구성 요소 가지 fomrcontrol 결합 할
Ramakanth 레디를

당신은 할 수 없습니다. 방법이 있더라도 그렇게해서는 안됩니다. 요소는 해당 구성 요소에 정의 된 컨트롤에 바인딩되어야합니다. 데이터를 다른 구성 요소로 전달하려면 서비스를 사용하십시오 (또는 상위 구성 요소 인 경우 이벤트 이미 터). Google 구성 요소간에 데이터를 전달하는 방법
rmcsharry

이 게시물을
봐주세요

2

Angular 문서 ( https://angular.io/guide/reactive-forms )에서 :

구성 요소

@Component({
  ...
})
export class ProfileEditorComponent {
  profileForm = new FormGroup({
    firstName: new FormControl(''),
    lastName: new FormControl(''),
  });
}

주형

<form [formGroup]="profileForm">

  <label>
    First Name:
    <input type="text" formControlName="firstName">
  </label>

  <label>
    Last Name:
    <input type="text" formControlName="lastName">
  </label>

</form>

FormGroup에 컨트롤 그룹이 포함 된 것처럼 profileForm FormGroupFormGroup 지시문 을 사용하여 양식 요소에 바인딩되어 모델과 입력이 포함 된 양식 사이에 통신 계층을 생성합니다. formControlName의해 제공된 입력 FormControlName지시문에 정의 된 형태로 각각의 제어 입력을 결합FormGroup


1

당신이 구독하고 사용할 수있는를 반환하는 (지금 당장 이걸 알고 있고, 아마 그 이상이있을 [formControl]수 있습니다) FormControl라는 속성이 있기 때문에 당신 과 함께 반응 프로그래밍 이점 을 사용할 수 있습니다. (예를 들어 사용자가 값을 변경하자마자 입력 이메일이 반복되지 않도록 확인하고자하는 등록 시나리오에 매우 유용합니다.)valueChangesObservable


예. 그러나 답변에서 모델을 사용하는 경우에도 템플릿에서 formControlName을 계속 사용합니다. someFormControlName : FormControl과 같이 component.ts 파일의 FormControl에 formControlName =“someFormControlName”을 할당하면됩니다.
Charles Robertson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.