Estoy usando ReactiveFormsModule
Angular2 para crear un componente que contiene un formulario. Aquí está mi código:
foo.component.ts :
constructor(fb: FormBuilder) {
this.myForm = fb.group({
'fullname': ['', Validators.required],
'gender': []
});
}
foo.component.html (con [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 (con 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 formas funcionan. Pero no puedo entender cuál es la diferencia entre usar [formControl]
y formControlName
.
Respuestas:
Creo que se perdió un punto importante: la
[formGroup]
directiva en el segundo ejemplo.formControlName
se utiliza junto con[formGroup]
para guardar su formulario de navegación de múltiples puntos. Por ejemplo:Es equivalente a:
Ahora imagina anidado
FormGroups
:)fuente
[formControl]
causando problemas durante laform.valid
validación con formGroup, cualquier comentario[formControl]
asigna una referencia a laFormControl
instancia que creó alFormControlDirective
.formControlName
asigna una cadena para que el módulo de formularios busque el control por nombre.Si crea variables para los controles, tampoco necesita las
.
que menciona Harry, pero también sugiero usarlas[formGroup]
en su lugar porque con formas más complicadas esto puede volverse complicado.fuente
Hay una tercera equivalencia a las dos proporcionadas en la respuesta aceptada, que es esta (no recomendada):
Observe que todavía estamos usando la directiva [formGroup].
Sin embargo, para que esta plantilla se compile sin errores, entonces su componente debe declarar los controles como AbstractControls y no FormControls:
myComponent.ts
Sin embargo, tenga en cuenta que no se recomienda declarar AbstractControls , por lo que si obtiene el error
Cannot find control with unspecified name attribute
, es probable que haya mezclado los estilos o haya declarado sus controles como AbstractControls.fuente
De los documentos de Angular ( https://angular.io/guide/reactive-forms ):
Componente
Modelo
fuente
con
[formControl]
puede usar las ventajas de la programación reactiva porqueFormControl
tiene una propiedad llamadavalueChanges
(conozco esta en este momento, tal vez haya más que eso) que devuelve unaObservable
que puede suscribirse y usar. (por ejemplo, es muy útil en escenarios de registro en los que desea verificar que el correo electrónico de entrada no se repita tan pronto como el usuario cambie el valor)fuente