Estou usando o ReactiveFormsModule
Angular2 para criar um componente que contém um formulário. Aqui está o meu código:
foo.component.ts :
constructor(fb: FormBuilder) {
this.myForm = fb.group({
'fullname': ['', Validators.required],
'gender': []
});
}
foo.component.html (com [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 (com 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>
Ambas as formas funcionam. Mas não consigo descobrir qual é a diferença entre usar [formControl]
e formControlName
.
angular
radio-button
angular2-forms
form-control
angular2-formbuilder
rato inteligente
fonte
fonte
Respostas:
Acredito que você perdeu um ponto importante:
[formGroup]
diretiva no segundo exemplo.formControlName
é usado junto com[formGroup]
para salvar suas navegações de vários pontos do formulário. Por exemplo:É equivalente a:
Agora imagine aninhado
FormGroups
:)fonte
[formControl]
causando problema durante aform.valid
validação com formGroup, quaisquer comentários[formControl]
atribui uma referência àFormControl
instância que você criou para oFormControlDirective
.formControlName
atribui uma string para o módulo de formulários para pesquisar o controle por nome.Se você criar variáveis para os controles, também não precisará do
.
conforme mencionado por Harry, mas também sugiro usar[formGroup]
em vez disso, porque com formulários mais complicados isso pode se tornar confuso.fonte
Há uma 3ª equivalência com as duas fornecidas na resposta aceita, que é esta (não recomendado):
Observe que ainda estamos usando a diretiva [formGroup].
No entanto, para que este modelo seja compilado sem erros, seu componente precisa declarar os controles como AbstractControls e não FormControls:
myComponent.ts
No entanto, observe que declarar AbstractControls não é recomendado , portanto, se você receber o erro
Cannot find control with unspecified name attribute
, é provável que tenha misturado os estilos ou declarado seus controles como AbstractControls.fonte
Dos documentos Angular ( https://angular.io/guide/reactive-forms ):
Componente
Modelo
fonte
com
[formControl]
você pode usar as vantagens da programação reativa porqueFormControl
tem uma propriedade chamadavalueChanges
(eu conheço esta agora, talvez haja mais do que isso) que retorna umObservable
que você pode assinar e usar. (por exemplo, é muito útil em cenários de registro em que você deseja verificar o e-mail de entrada para não ser repetido assim que o usuário alterar o valor)fonte