LA SITUATION:
S'il vous plaît aider! J'essaie de faire ce qui devrait être une forme très simple dans mon application Angular2 mais peu importe ce que cela ne fonctionne jamais.
VERSION ANGULAIRE:
Angulaire 2.0.0 Rc5
L'ERREUR:
Can't bind to 'formGroup' since it isn't a known property of 'form'
LE CODE:
La vue:
<form [formGroup]="newTaskForm" (submit)="createNewTask()">
<div class="form-group">
<label for="name">Name</label>
<input type="text" name="name" required>
</div>
<button type="submit" class="btn btn-default">Submit</button>
</form>
Le controlle:
import { Component } from '@angular/core';
import { FormGroup, FormControl, Validators, FormBuilder } from '@angular/forms';
import {FormsModule,ReactiveFormsModule} from '@angular/forms';
import { Task } from './task';
@Component({
selector: 'task-add',
templateUrl: 'app/task-add.component.html'
})
export class TaskAddComponent {
newTaskForm: FormGroup;
constructor(fb: FormBuilder)
{
this.newTaskForm = fb.group({
name: ["", Validators.required]
});
}
createNewTask()
{
console.log(this.newTaskForm.value)
}
}
Le ngModule:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { routing } from './app.routing';
import { AppComponent } from './app.component';
import { TaskService } from './task.service'
@NgModule({
imports: [
BrowserModule,
routing,
FormsModule
],
declarations: [ AppComponent ],
providers: [
TaskService
],
bootstrap: [ AppComponent ]
})
export class AppModule { }
LA QUESTION:
Pourquoi ai-je cette erreur?
Est-ce que je manque quelque chose?
RC5 FIX
Vous devez import { REACTIVE_FORM_DIRECTIVES } from '@angular/forms'
dans votre contrôleur et l'ajouter à directives
dans @Component
. Cela résoudra le problème.
Une fois que vous aurez résolu ce problème, vous obtiendrez probablement une autre erreur car vous n'avez pas ajouté formControlName="name"
à votre entrée sous forme.
RC6/RC7/Version finale FIX
Pour corriger cette erreur, il vous suffit d'importer ReactiveFormsModule
à partir de @angular/forms
dans votre module. Voici l'exemple d'un module de base avec ReactiveFormsModule
import:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
@NgModule({
imports: [
BrowserModule,
FormsModule,
ReactiveFormsModule
],
declarations: [
AppComponent
],
bootstrap: [AppComponent]
})
export class AppModule { }
Pour expliquer davantage, formGroup
est un sélecteur de directive nommée FormGroupDirective
qui fait partie de ReactiveFormsModule
, d'où la nécessité de l'importer. Il est utilisé pour lier un FormGroup
existant à un élément DOM. Vous pouvez en savoir plus à ce sujet sur page de documentation officielle d'Angular .
Angular 4 en combinaison avec modules de fonctions (si vous utilisez par exemple un module partagé), vous devez également exporter le fichier ReactiveFormsModule
pour qu'il fonctionne.
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
@NgModule({
imports: [
CommonModule,
ReactiveFormsModule
],
declarations: [],
exports: [
CommonModule,
FormsModule,
ReactiveFormsModule
]
})
export class SharedModule { }
Ok, après quelques recherches, j'ai trouvé une solution pour "Impossible de se lier à 'formGroup' car ce n'est pas une propriété connue de 'form'."
Pour mon cas, j'ai utilisé plusieurs fichiers de modules, j'ai ajouté ReactiveFormsModule dans app.module.ts.
import { FormsModule, ReactiveFormsModule } from '@angular/forms';`
@NgModule({
declarations: [
AppComponent,
]
imports: [
FormsModule,
ReactiveFormsModule,
AuthorModule,
],
...
Mais cela ne fonctionnait pas lorsque j'utilisais une directive [formGroup] à partir d'un composant ajouté à un autre module, par exemple. using [formGroup] dans author.component.ts qui est abonné dans le fichier author.module.ts:
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { AuthorComponent } from './author.component';
@NgModule({
imports: [
CommonModule,
],
declarations: [
AuthorComponent,
],
providers: [...]
})
export class AuthorModule {}
Je pensais que si j'ajoutais ReactiveFormsModule dans app.module.ts, par défaut, ReactiveFormsModule serait hérité par tous ses modules enfants, comme author.module dans ce cas ... (faux!). J'avais besoin d'importer ReactiveFormsModule dans author.module.ts pour que toutes les directives fonctionnent:
...
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
...
@NgModule({
imports: [
...,
FormsModule, //added here too
ReactiveFormsModule //added here too
],
declarations: [...],
providers: [...]
})
export class AuthorModule {}
Par conséquent, si vous utilisez des sous-modules, veillez à importer ReactiveFormsModule dans chaque fichier de sous-module. J'espère que cela aide quelqu'un.
J'ai rencontré cette erreur lors du test unitaire d'un composant (uniquement lors du test, au sein de l'application, cela a fonctionné normalement). La solution consiste à importer ReactiveFormsModule
dans le fichier .spec.ts
:
// Import module
import { ReactiveFormsModule } from '@angular/forms';
describe('MyComponent', () => {
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [MyComponent],
imports: [ReactiveFormsModule], // Also add it to 'imports' array
})
.compileComponents();
}));
});
La réponse suggérée ne fonctionnait pas pour moi avec Angular 4. À la place, je devais utiliser un autre moyen de liaison d'attribut avec le préfixe attr
:
<element [attr.attribute-to-bind]="someValue">
Si vous devez importer deux modules, ajoutez comme ceci ci-dessous
import {ReactiveFormsModule,FormsModule} from '@angular/forms';
@NgModule({
declarations: [
AppComponent,
HomeComponentComponent,
BlogComponentComponent,
ContactComponentComponent,
HeaderComponentComponent,
FooterComponentComponent,
RegisterComponent,
LoginComponent
],
imports: [
BrowserModule,
FormsModule,
HttpModule,
routes,
ReactiveFormsModule
],
providers: [],
bootstrap: [AppComponent]
})
J'ai eu le même problème avec Angular 7. Importez simplement ce qui suit dans votre fichier app.module.ts.
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
Ajoutez ensuite FormsModule et ReactiveFormsModule dans votre tableau d’importations.
imports: [
FormsModule,
ReactiveFormsModule
],
N'oubliez pas que si vous avez défini les "modules de fonctions", vous devez importer dans le module de fonctions, même si vous avez déjà importé dans le fichier AppModule
. De la documentation Angular:
Les modules n'héritent pas des accès aux composants, directives ou canaux déclarés dans d'autres modules. Ce que AppModule importe n'est pas pertinent pour ContactModule et inversement. Avant que ContactComponent puisse se lier avec [(ngModel)], son ContactModule doit importer FormsModule.
Ce problème est dû à une importation manquante de FormsModule. ReactiveFormsModule .I est également arrivé avec le même problème. Mon cas était diff. comme je travaillais avec des modules. J'ai donc manqué les importations précédentes dans mes modules parents, même si je l'avais importé dans des modules enfants, cela ne fonctionnait pas.
Ensuite, je l'ai importé dans mes modules parents comme ci-dessous, et cela a fonctionné!
import { ReactiveFormsModule,FormsModule } from '@angular/forms';
import { AlertModule } from 'ngx-bootstrap';
@NgModule({
imports: [
CommonModule,
FormsModule,
ReactiveFormsModule,
],
declarations: [MyComponent]
})
Je rencontrais cette erreur en essayant de faire des tests e2e et cela me rendait fou de penser qu'il n'y avait pas de réponse à cela.
SI VOUS FAITES DES ESSAIS, trouvez votre fichier * .specs.ts et ajoutez:
import {ReactiveFormsModule, FormsModule} from '@angular/forms';
Pour les personnes parcourant ces discussions à propos de cette erreur. Dans mon cas, j'avais un module partagé dans lequel je n'exportais que les FormsModule et ReactiveFormsModule et j'oubliais de l'importer. Cela a provoqué une erreur étrange indiquant que formgroups ne fonctionnait pas dans les sous-composants. J'espère que cela aide les gens à se gratter la tête.
N PEU NOTE: Faites attention aux chargeurs et minimisez (env. Rails):
Après avoir constaté cette erreur et essayé toutes les solutions, j'ai compris qu'il y avait un problème avec mon chargeur html.
J'ai configuré mon environnement Rails pour importer les chemins HTML de mes composants avec succès avec ce chargeur (config/loaders/html.js.
):
module.exports = {
test: /\.html$/,
use: [ {
loader: 'html-loader?exportAsEs6Default',
options: {
minimize: true
}
}]
}
Après quelques heures d'efforts et d'innombrables importations d'importations de ReactiveFormsModule, j'ai constaté que mon formGroup
était composé de petites lettres: formgroup
.
Cela m'a conduit au chargeur et au fait qu'il réduise mon code HTML au minimum.
Après avoir changé les options, tout a fonctionné comme il se doit et je pourrais recommencer à pleurer.
Je sais que ce n’est pas une réponse à la question, mais pour les futurs visiteurs de Rails (et d’autres avec des chargeurs personnalisés), je pense que cela pourrait être utile.
Si vous rencontrez ce problème lorsque vous développez un composant, vous devez donc ajouter ces deux modules à votre module le plus proche:
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
@NgModule({
declarations: [
AppComponent
],
imports: [
// other modules
FormsModule,
ReactiveFormsModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
Et si vous développez un test pour vos composants, vous devez ajouter ce module à votre fichier de test de la manière suivante:
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ContactusComponent } from './contactus.component';
import { ReactiveFormsModule } from '@angular/forms';
describe('ContactusComponent', () => {
let component: ContactusComponent;
let fixture: ComponentFixture<ContactusComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ContactusComponent],
imports:[
ReactiveFormsModule
]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ContactusComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
utiliser et importer REACTIVE_FORM_DIRECTIVES:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
@NgModule({
imports: [
BrowserModule,
FormsModule,
ReactiveFormsModule
],
declarations: [
AppComponent
],
bootstrap: [AppComponent]
})
export class AppModule { }
Importez et enregistrez ReactiveFormsModule dans votre app.module.ts.
import { ReactiveFormsModule } from '@angular/forms';
@NgModule({
declarations: [
AppComponent,
HighlightDirective,
TestPipeComponent,
ExpoentialStrengthPipe
],
imports: [
BrowserModule,
ReactiveFormsModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
Assurez-vous que votre orthographe est correcte dans les fichiers .ts et .html. xxx.ts
profileForm = new FormGroup({
firstName: new FormControl(''),
lastName: new FormControl('')
});
xxx.html fichier-
<form [formGroup]="profileForm">
<label>
First Name:
<input type="text" formControlName = "firstName">
</label>
<label>
Last Name:
<input type="text" formControlName = "lastName">
</label>
</form>
J'étais par erreur écrit [FormGroup] insted de [FormGroup]. Vérifiez votre orthographe correctement en .html. Il ne jette pas d'erreur de temps de compilation Si quelque chose ne va pas dans le fichier .html.
Can't bind to 'formGroup' since it isn't a known property of 'form'
signifie que vous essayez de lier une propriété en utilisant angular ([prop]
) mais angular ne trouve rien qu'il sache pour cet élément (dans ce cas form
).
cela peut arriver en n'utilisant pas le bon module (il manque une importation quelque part) et en provoquant parfois une faute de frappe comme:
[formsGroup]
, avec s
après form
Une fois que j’ai ajouté mon module à la AppModule
tout a bien fonctionné.