Uncaught Error: Módulo inesperado 'FormsModule' declarado por el módulo 'AppModule'. Por favor, añada una anotación @Pipe/@Directive/@Component

Soy nuevo en Angular. Empecé Tour of Heroes para aprenderlo. Así que, estoy creado un app.component con two-way binding.

import { Component } from '@angular/core';
export class Hero {
    id: number;
    name: string;
}
@Component({
    selector: 'app-root',
    template: `
        <h1>{{title}}</h1>
        <h2>{{hero.name}}  details!</h2>
        <div><label>id: </label>{{hero.id}}</div>
        <div><label>Name: </label>
            <input [(ngModel)]="hero.name" placeholder="Name">
        </div>
    `,
    styleUrls: ['./app.component.css']
})
export class AppComponent {
    title = 'Tour of Heroes';
    hero: Hero = {
        id: 1,
        name: 'Windstorm'
    };
}

Siguiendo el tutorial importé FormsModule y lo añadí en el array de declaraciones. El error apareció en este paso:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { FormsModule } from '@angular/forms';

@NgModule({
  declarations: [
      AppComponent,
      FormsModule
  ],
  imports: [
    BrowserModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

Aquí está el error:

Uncaught Error: Módulo inesperado 'FormsModule' declarado por el módulo 'AppModule'. Por favor, añada una anotación @Pipe/@Directive/@Component.

Solución

FormsModule debería añadirse en la matriz imports y no en la matriz declarations.

  • La matriz imports es para importar módulos como BrowserModule, FormsModule, HttpModule.
  • La matriz de declaraciones es para tus componentes, tuberías y directivas.

refiérase a la siguiente modificación:

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    FormsModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
Comentarios (2)

Añadir FormsModule en la matriz de importaciones.

@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
FormsModule
],
providers: [],
bootstrap: [AppComponent]
})

O esto se puede hacer sin usar [(ngModel)] utilizando

<input [value]='hero.name' (input)='hero.name=$event.target.value' placeholder="name">

en lugar de

<input [(ngModel)]="hero.name" placeholder="Name">
Comentarios (0)

Eliminar el FormsModule de Declaración:[] y añadir el FormsModule en imports:[]

@NgModule({
  declaraciones: [
    AppComponent
  ],
  importaciones: [
    BrowserModule,
    FormsModule
  ],
  proveedores: [],
  bootstrap: [AppComponent]
})
Comentarios (1)