1758 votes

Impossible de se lier à 'ngModel' car ce n'est pas une propriété connue de 'input'.

J'ai obtenu l'erreur suivante lors du lancement de mon application Angular, même si le composant n'est pas affiché.

Je dois commenter le <input> pour que mon application fonctionne.

zone.js:461 Unhandled Promise rejection: Template parse errors:
Can't bind to 'ngModel' since it isn't a known property of 'input'. ("
   <div>
      <label>Created:</label>
      <input  type="text" [ERROR ->][(ngModel)]="test" placeholder="foo" />
   </div>
</div>"): InterventionDetails@4:28 ; Zone: <root> ; Task: Promise.then ; Value: 

Je regarde le Hero plunker, mais je ne vois pas de différence avec mon code.

Voici le fichier du composant :

import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { Intervention } from '../../model/intervention';

@Component({
   selector: 'intervention-details',
   templateUrl: 'app/intervention/details/intervention.details.html',
   styleUrls: ['app/intervention/details/intervention.details.css']
})

export class InterventionDetails
{
   @Input() intervention: Intervention;

   public test : string = "toto";
}

15 votes

Qu'est-ce que le plumeur d'Hero ?

3 votes

J'ai le même problème depuis qu'ils ont mis à jour vers rc5 hier (curieusement cela fonctionne pour mon collègue..) Je pense que @abreneliere parle de leurs tutoriels - angular.io/docs/ts/latest/tutorial

4 votes

@DanielShillcock, Tour des Héros .

2421voto

Anthony Brenelière Points 18778

Oui, c'est ça. Dans le app.module.ts que je viens d'ajouter :

import { FormsModule } from '@angular/forms';

[...]

@NgModule({
  imports: [
    [...]
    FormsModule
  ],
  [...]
})

19 votes

En fait, je préfère cette réponse à celle de Gabriele (qui n'est qu'un lien). Ici, le code exact est présenté. Malheureusement, j'ai rencontré ce problème juste après l'"Introduction à Angular 2" de John Paps sur PluralSight, et ce problème n'a même pas été mentionné. Pour eux, la liaison bidirectionnelle a tout simplement fonctionné.

35 votes

Cela a fonctionné, mais seulement après l'avoir importé dans mon sous-module. Il n'est pas tout à fait clair pour les débutants que les sous-modules n'en héritent pas.

4 votes

Dans mon cas, j'ai mal utilisé les bretelles. J'utilisais [{ngModel}] au lieu de la bonne : [(ngModel)]

623voto

Gabriele Ciech Points 4865

Afin de pouvoir utiliser la liaison de données bidirectionnelle pour les entrées de formulaire, vous devez importer l'option FormsModule dans votre module Angular.

Pour plus d'informations, voir le tutoriel officiel d'Angular 2 aquí et la documentation officielle de formulaires .

9 votes

Je dois admettre que j'ai commencé avec Angular lundi (donc il y a 4 jours) et que je suivais leurs tutoriels, donc je suis presque sûr d'avoir fait quelque chose de mal, mais pour moi l'importation de FormsModule n'a pas fonctionné. Puis j'ai ajouté import { FORM_DIRECTIVES } from '@angular/forms'; et a ajouté le FORM_DIRECTIVES aux directives et ma liaison fonctionne à nouveau (pour être clair, elle fonctionnait avant la version rc5).

2 votes

Ce qui semble être lié à ceci stackoverflow.com/questions/31623879/

1 votes

@PetLahev Le problème que vous rencontrez avec le tutoriel est que le 7 août, lorsque vous avez commencé, le tutoriel fonctionnait avec la Release Candidate 4. Depuis le 8 août, ils sont à la Release Candidate 5, qui a une syntaxe différente.

283voto

Alireza Points 40192

Pour l'utilisation [(ngModel)] en Angulaire 2 , 4 & 5+ vous devez importer FormsModule de la forme angulaire...

De plus, c'est dans ce chemin sous les formes dans le Référentiel Angular en GitHub :

angular / packages / forms / src / directives / ng_model.ts

Ce n'est sans doute pas très agréable pour le Développeurs AngularJS comme vous pourriez utiliser ng-model partout à tout moment auparavant, mais comme Angular essaie de séparer les modules pour utiliser ce que vous souhaitez utiliser à ce moment-là, ngModel est en FormsModule maintenant.

De même, si vous utilisez ReactiveFormsModule il doit aussi l'importer.

Il suffit donc de chercher app.module.ts et assurez-vous que vous avez FormsModule importé dans...

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

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

export class AppModule { }

Voici également les commentaires de départ actuels pour Angular4 ngModel en FormsModule :

/**
 * `ngModel` forces an additional change detection run when its inputs change:
 * E.g.:
 * ```
 * <div>{{myModel.valid}}</div>
 * <input [(ngModel)]="myValue" #myModel="ngModel">
 * ```
 * I.e. `ngModel` can export itself on the element and then be used in the template.
 * Normally, this would result in expressions before the `input` that use the exported directive
 * to have and old value as they have been
 * dirty checked before. As this is a very common case for `ngModel`, we added this second change
 * detection run.
 *
 * Notes:
 * - this is just one extra run no matter how many `ngModel` have been changed.
 * - this is a general problem when using `exportAs` for directives!
 */

Si vous voulez utiliser votre entrée, pas dans un formulaire, vous pouvez l'utiliser avec ngModelOptions et rendre autonome vrai ...

[ngModelOptions]="{standalone: true}"

Pour plus d'informations, consultez le site ng_model dans la section Angulaire aquí .

65voto

Rexford Points 3131

En supposant que vous ayez créé un nouveau NgModule, par exemple AuthModule dédié à la gestion de vos besoins d'authentification, assurez-vous d'importer FormsModule dans cet AuthModule trop .

Si vous utilisez le FormsModule sólo dans le AuthModule alors vous n'auriez pas besoin d'importer le FormModule sur le défaut AppModule .

Donc quelque chose comme ça dans le AuthModule :

import { NgModule }      from '@angular/core';
import { FormsModule } from '@angular/forms';

import { authRouting } from './auth.routing';
import { LoginComponent, SignupComponent } from './auth.component';

@NgModule({
  imports:      [
    authRouting,
    FormsModule
   ],
  declarations: [
    SignupComponent,
    LoginComponent
  ]
})
export class AuthModule { }

Alors oubliez l'importation dans AppModule si vous n'utilisez pas le FormsModule n'importe où ailleurs.

0 votes

J'en avais besoin dans le sous-module où j'utilisais les fonctionnalités du formulaire. Un module plus élevé dans la hiérarchie n'était pas suffisant.

48voto

debugmode Points 421

Il y a deux étapes que vous devez suivre pour vous débarrasser de cette erreur :

  1. Importez FormsModule dans votre module d'application
  2. Passez-le comme valeur des importations dans le décorateur @NgModule

En gros, le fichier app.module.ts devrait ressembler à ce qui suit :

    import { NgModule }      from '@angular/core';
    import { BrowserModule } from '@angular/platform-browser';
    import { FormsModule }   from '@angular/forms';
    import { AppComponent }  from './app.component';
    import {AppChildComponent} from './appchild.component';
    @NgModule({
      imports:      [ BrowserModule,FormsModule ],
      declarations: [ AppComponent, AppChildComponent ],
      bootstrap:    [ AppComponent ]
    })
    export class AppModule { }

0 votes

Merci. Je ne l'avais pas déclaré dans la section des importations et cela me rendait fou lorsque je déplaçais un composant dans un sous-module.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X