angular - Angular2-Fehler: Es gibt keine Direktive, bei der „exportAs“ auf „ngForm“ gesetzt ist
Ich bin auf dem RC4 und bekomme den Fehler Es gibt keine Direktive mit "exportAs" auf "ngForm" gesetzt wegen meines Templates :
<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>
die 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]);
/// also hier ist meine Dropdown-Liste :
<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>
//mein Komponentents ts :
Ich habe es in den alten Formen so dargestellt:
categoryControlGroups:ControlGroup[] = [];
categories:ControlArray = new ControlArray(this.categoryControlGroups);
und jetzt mache ich das :
categoryControlGroups:FormGroup[] = [];
categories:FormArray = new FormArray(this.categoryControlGroups);
Du denkst, es ist die Ursache des Problems??
Antwort #1
Seit 2.0.0.rc6:
Formulare: Die veralteten Funktionen
provideForms()unddisableDeprecatedForms()wurden entfernt. Bitte importieren Sie stattdessen dasFormsModuleoder dasReactiveFormsModulevon@angular/forms.
Kurz gesagt:
- Wenn Sie template-gesteuerte Formulare verwenden, fügen Sie
FormsModulezu Ihrem@NgModulehinzu. - Wenn Sie modellgesteuerte Formulare verwenden, fügen Sie
ReactiveFormsModulezu Ihrem@NgModulehinzu.
Also, füge zu deiner app.module.ts oder dem Äquivalent hinzu:
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 { }
Wenn eines dieser Module fehlt, kann dies zu Fehlern führen, einschließlich des Fehlers, dem Sie gegenüberstehen:
Kann nicht an 'ngModel' binden, da es keine bekannte Eigenschaft von 'input' ist.
Kann nicht an 'formGroup' binden, da es keine bekannte Eigenschaft von 'form' ist
Es gibt keine Direktive mit "exportAs", die auf "ngForm" gesetzt ist
Wenn Sie Zweifel haben, können Sie sowohl das FormsModule als auch das ReactiveFormsModule zusammen bereitstellen, aber sie funktionieren auch vollständig getrennt. Wenn Sie eines dieser Module bereitstellen, stehen die standardmäßigen Formulardirektiven und -anbieter aus diesem Modul in der gesamten App zur Verfügung.
Alte Formulare, die ngControl verwenden?
Wenn Sie diese Module in Ihrem @NgModule haben, verwenden Sie vielleicht alte Direktiven, wie ngControl, was ein Problem ist, da es kein ngControl in den neuen Formularen gibt. Es wurde mehr oder weniger* durch ngModel ersetzt.
Zum Beispiel entspricht <input ngControl="actionType"> <input ngModel name="actionType">, also ändern Sie das in Ihrer Vorlage.
Ähnlich ist der Export bei Steuerungen nicht mehr ngForm, sondern jetzt ngModel. Also ersetzen Sie in Ihrem Fall #actionType="ngForm" durch #actionType="ngModel".
Also sollte die resultierende Vorlage (===>s dort, wo geändert) sein:
<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>
* Mehr oder weniger, weil nicht alle Funktionen von ngControl auf ngModel übertragen wurden. Einige wurden einfach entfernt oder sind jetzt anders. Ein Beispiel ist das name-Attribut, genau der Fall, den Sie gerade haben.
Antwort #2
Ich hatte dasselbe Problem. Ich hatte das Import-Tag des Forms-Moduls in der app.module.ts verpasst.
import { FormsModule } from '@angular/forms';
@NgModule({
imports: [BrowserModule,
FormsModule
],
