angular - Angular2 Error: No hay ninguna directiva con "exportAs" establecido en "ngForm"
Estoy en la RC4 y estoy obteniendo el error No hay ninguna directiva con "exportAs" configurada como "ngForm" debido a mi plantilla:
<div class="form-group">
<label for="actionType">Action Type</label>
<select
ngControl="actionType"
===> #actionType="ngForm"
id="actionType"
class="form-control"
required>
<option value=""></option>
<option *ngFor="let actionType of actionTypes" value="{{ actionType.label }}">
{{ actionType.label }}
</option>
</select>
</div>
el boot.ts :
import {disableDeprecatedForms, provideForms} from '@angular/forms';
import {bootstrap} from '@angular/platform-browser-dynamic';
import {HTTP_PROVIDERS, Http} from '@angular/http';
import {provideRouter} from '@angular/router';
import {APP_ROUTER_PROVIDER} from './routes';
import {AppComponent} from './app.component';
bootstrap(AppComponent, [ disableDeprecatedForms(), provideForms(), APP_ROUTER_PROVIDER, HTTP_PROVIDERS]);
/// así que aquí está mi DropdownList :
<fieldset ngControlGroup="linkedProcess" >
<div ngControlGroup="Process" >
<label>Linked Process</label>
<div class="form-group">
<select
ngModel
name="label"
#label="ngModel"
id="label"
class="form-control" required
(change)="reloadProcesse(list.value)"
#list>
<option value=""></option>
<!--<option value=`{{ActionFormComponent.getFromString('GET'')}}`></option>-->
<option *ngFor="let processus of linkedProcess?.processList?.list; let i = index"
value="{{ processus[i].Process.label}}">
{{processus.Process.label}}
</option>
</select>
</div>
</div>
//mi componente ts :
Lo estaba representando en las formas antiguas así:
categoryControlGroups:ControlGroup[] = [];
categories:ControlArray = new ControlArray(this.categoryControlGroups);
y ahora estoy haciendo esto :
categoryControlGroups:FormGroup[] = [];
categories:FormArray = new FormArray(this.categoryControlGroups);
¿Crees que es la causa del problema?
Respuesta #1
Desde 2.0.0.rc6:
formularios: las funciones obsoletas
provideForms()ydisableDeprecatedForms()han sido eliminadas. Por favor, importe elFormsModuleo elReactiveFormsModulede@angular/formsen su lugar.
En resumen:
- Si utilizas formularios basados en plantillas, agrega
FormsModulea tu@NgModule. - Si utilizas formularios basados en modelos, agrega
ReactiveFormsModulea tu@NgModule.
Así que, agrega a tu app.module.ts o equivalente:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; // <== add the imports!
import { AppComponent } from './app.component';
@NgModule({
imports: [
BrowserModule,
FormsModule, // <========== Add this line!
ReactiveFormsModule // <========== Add this line!
],
declarations: [
AppComponent
// other components of yours
],
bootstrap: [ AppComponent ]
})
export class AppModule { }
No tener uno de estos módulos puede conducir a errores, incluido el que enfrentas:
No se puede enlazar a 'ngModel' ya que no es una propiedad conocida de 'input'.
No se puede enlazar a 'formGroup' ya que no es una propiedad conocida de 'form'
No hay ninguna directiva con "exportAs" configurada como "ngForm"
Si tienes dudas, puedes proporcionar tanto el FormsModule como el ReactiveFormsModule juntos, pero son completamente funcionales por separado. Cuando proporcionas uno de estos módulos, las directivas y proveedores de formularios predeterminados de ese módulo estarán disponibles en toda tu aplicación.
¿Formas antiguas usando ngControl?
Si tienes esos módulos en tu @NgModule, quizás estés usando directivas antiguas, como ngControl, lo cual es un problema, porque no hay ngControl en los formularios nuevos. Fue reemplazado más o menos* por ngModel.
Por ejemplo, el equivalente a <input ngControl="actionType"> es <input ngModel name="actionType">, así que cámbialo en tu plantilla.
De manera similar, la exportación en los controles ya no es ngForm, ahora es ngModel. Entonces, en tu caso, reemplaza #actionType="ngForm" con #actionType="ngModel".
Entonces, la plantilla resultante debería ser (===>s donde se cambió):
<div class="form-group">
<label for="actionType">Action Type</label>
<select
===> ngModel
===> name="actionType"
===> #actionType="ngModel"
id="actionType"
class="form-control"
required>
<option value=""></option>
<option *ngFor="let actionType of actionTypes" value="{{ actionType.label }}">
{{ actionType.label }}
</option>
</select>
</div>
* Más o menos porque no toda la funcionalidad de ngControl se trasladó a ngModel. Algunas simplemente fueron eliminadas o ahora son diferentes. Un ejemplo es el atributo name, el mismo caso que estás teniendo ahora.
Respuesta #2
Me enfrenté al mismo problema. Había olvidado la etiqueta de importación del módulo de formularios en el app.module.ts
import { FormsModule } from '@angular/forms';
@NgModule({
imports: [BrowserModule,
FormsModule
],
