Estoy en el RC4 y recibo el error No hay una directiva con "exportAs" establecido en "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 como esta:
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?
Respuestas:
Desde 2.0.0.rc6 :
En breve:
FormsModule
a su@NgModule
.ReactiveFormsModule
a su@NgModule
.Entonces, agregue a su
app.module.ts
o equivalente:No tener uno de estos módulos puede provocar errores, incluido el que enfrenta:
Si tiene dudas, puede proporcionar tanto el
FormsModule
como elReactiveFormsModule
juntos, pero son completamente funcionales por separado. Cuando proporcione uno de estos módulos, las directivas de formularios predeterminados y los proveedores de ese módulo estarán disponibles para toda la aplicación.ngControl
¿ Utiliza formularios antiguos ?Si tiene esos módulos
@NgModule
, tal vez esté usando directivas antiguas, comongControl
, lo cual es un problema, porque no hay ningunangControl
en los nuevos formularios. Fue reemplazado más o menos * porngModel
.Por ejemplo, el equivalente a
<input ngControl="actionType">
es<input ngModel name="actionType">
, así que cámbielo en su plantilla.Del mismo modo, la exportación en controles
ngForm
ya no es , es ahorangModel
. Entonces, en su caso, reemplace#actionType="ngForm"
con#actionType="ngModel"
.Entonces, la plantilla resultante debe ser (
===>
s donde se haya cambiado):* Más o menos, porque no toda la funcionalidad de
ngControl
se trasladó angModel
. Algunos simplemente fueron eliminados o ahora son diferentes. Un ejemplo es elname
atributo, el mismo caso que está teniendo en este momento.fuente
<input>
dentro de un*ngFor
? (Probablemente no va a funcionar, pero probar esto y dime si el mensaje desaparece:<option *ngFor="let actionType of actionTypes; let i = index" value="{{ actionTypes[i].label }}"> {{ actionTypes[i].label }} </option>
)*ngFor
?*ngFor
a algo diferente aactionType
, ¿algo bueno?Me enfrenté al mismo problema. Me había perdido la etiqueta de importación del módulo de formularios en app.module.ts
fuente
Tuve el mismo problema que se resolvió agregando FormsModule a .spec.ts:
y luego agregando la importación a beforeEach:
fuente
Si recibe esto en su lugar:
Lo cual se informó como un error en github , entonces probablemente no sea un error, ya que podría:
[(ngModel)]]=
, OformControlName
, con langModel
Directiva . Esto "ha quedado obsoleto en Angular v6 y se eliminará en Angular v7" , ya que mezcla ambas estrategias de formulario, lo que lo convierte en:Cuando tienes una entrada como esta:
Mostrará una advertencia sobre estrategias de formas mixtas en la consola del navegador:
Sin embargo, si agrega
ngModel
como valor en una variable de referencia, ejemplo:A continuación, se activa el error anterior y no se muestra ninguna advertencia sobre la combinación de estrategias.
fuente
En mi caso tuve que agregar
FormsModule
yReactiveFormsModule
alshared.module.ts
también:(gracias a @Undrium por el ejemplo de código ):
fuente
Tuve este problema y me di cuenta de que no había vinculado mi componente a una variable.
Cambiado
<input #myComponent="ngModel" />
a
<input #myComponent="ngModel" [(ngModel)]="myvar" />
fuente
La forma correcta de usar formularios ahora en Angular2 es:
La forma antigua ya no funciona
fuente
También me di cuenta de que este problema surge cuando se intenta combinar enfoques de formulario reactivo y formulario de plantilla. Tenía
#name="ngModel"
y[formControl]="name"
en el mismo elemento. Eliminar cualquiera de los dos solucionó el problema. Tampoco es que si lo usa#name=ngModel
también debería tener una propiedad como esta[(ngModel)]="name"
, de lo contrario, aún obtendrá los errores. Esto también se aplica a los angulares 6, 7 y 8.fuente
Compruebe que tiene ambos
ngModel and name
atributos en su selección. También Select es un componente de formulario y no el formulario completo, por lo que una declaración más lógica de referencia local será: -Una cosa más importante es asegurarse de importar, ya sea
FormsModule
en el caso del enfoque basado en plantillas oReactiveFormsModule
en el caso del enfoque reactivo. O puede importar ambos, lo que también está totalmente bien.fuente
si
ngModule
no funciona en la entrada significa intentar ... eliminar las comillas dobles alrededorngModule
me gusta
en lugar de arriba
fuente
Tuve este problema porque tenía un error tipográfico en mi plantilla cerca de [(ngModel)]]. Soporte adicional. Ejemplo:
fuente