В чем разница между formControlName и FormControl?
Я использую 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
Я считаю, что вы пропустили важный момент: директива [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
:)
Ответ 2
[formControl]
назначает ссылку на экземпляр FormControl
, который вы создали для FormControlDirective
.
formControlName
назначает строку для модуля формы для поиска элемента управления по имени.
Если вы создаете переменные для элементов управления, вам также не нужен .
, как упоминалось Гарри, но я также предлагаю использовать [formGroup]
вместо этого, потому что с более сложными формами это может стать беспорядочным.
constructor(fb: FormBuilder) {
this.fullName = new FormControl('', Validators.required);
this.gender = new FormControl('');
this.myForm = fb.group({
'fullname': this.fullName,
'gender': this.gender
});
}