无法绑定到'ngModel',因为它不是'input'的已知属性

Ant*_*ère 1173 javascript input typescript angular

启动Angular应用程序时出现以下错误,即使未显示该组件也是如此.

我必须注释掉,以便我的应用程序正常运行.

    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: 
Run Code Online (Sandbox Code Playgroud)

我正在看着英雄的掠夺者,但我没有看到任何区别.

这是组件文件:

    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";
    }
Run Code Online (Sandbox Code Playgroud)

Ant*_*ère 1662

是的,就是它,在app.module.ts中,我刚刚补充说:

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

[...]

@NgModule({
  imports: [
    [...]
    FormsModule
  ],
  [...]
})
Run Code Online (Sandbox Code Playgroud)

  • 对于因Jasmine类似失败而发现此问题的人,您还需要将这些导入添加到`component.spec.ts`文件中. (22认同)
  • 这有效,但只有在我将其导入子模块后才能使用.初学者并不完全清楚这不会被子模块继承. (17认同)
  • 实际上,我更喜欢这个答案给Gabriele(这只是一个链接).在这里,提供了确切的代码.令人讨厌的是,我在PluralSight的John Paps的"Angular 2简介"中遇到了这个问题,甚至没有提到这个问题.对他们来说,双向绑定才有效. (13认同)
  • 就我而言,我使用牙套是错误的。我使用的是[[{ngModel}]`而不是正确的:`[(ngModel)]` (3认同)
  • 以及放置位置(关于茉莉花错误):/sf/ask/2770917411/ -in#answer-39584550 (3认同)
  • @Imtiaz 记得“盒子里的香蕉”:`[()]` *不是*盒子里的胡子`[{}]`...恶心!https://angular.io/guide/template-syntax (2认同)

小智 501

为了能够对表单输入使用双向数据绑定,您需要FormsModuleAngular模块中导入包.有关更多信息,请参阅此处Angular 2官方教程和表单的官方文档

  • 我不得不承认我在星期一开始使用Angular(所以4天前)并且正在做他们的教程所以我很确定我做错了但是对我来说导入FormsModule不起作用.然后我从'@ angular/forms'中添加了`import {FORM_DIRECTIVES};`并将`FORM_DIRECTIVES`添加到指令中,是的,我的绑定再次起作用(要清楚它在rc5发布之前有效) (8认同)
  • 如果你使用的是SharedModule,那么你可能需要在那里导入FormsModule,这是没有价值的. (6认同)
  • 为了以防万一,`FORM_DIRECTIVES`已经死了 (4认同)
  • 这似乎与此http://stackoverflow.com/questions/31623879/angular-2-two-way-binding-using-ng-model-is-not-working相关 (2认同)
  • @PetLahev 您在本教程中遇到的问题是,在 8 月 7 日,当您开始时,教程正在运行候选版本 4。截至 8 月 8 日,它们位于候选版本 5,其语法不同 (2认同)

Ali*_*eza 224

对于使用[(ngModel)]角2,4&5+,你需要导入FormsModule从角形态...

它也是在github中Angular repo中的表单下的这条路径中:

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

也许这不是一个非常高兴的AngularJs开发者,你可以使用NG-模型之前的任何时间无处不在,但作为角试图单独的模块来使用任何你想你想的时候使用,ngModelFormsModule现在.

此外,如果您使用ReactiveFormsModule,也需要导入它.

所以只需查找app.module.ts并确保已FormsModule导入...

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 { }
Run Code Online (Sandbox Code Playgroud)

这也是FormsModule ngModelAngular4的当前开始注释:

/**
 * `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!
 */
Run Code Online (Sandbox Code Playgroud)

如果你想使用你的输入,而不是表格,你可以使用它ngModelOptions并使其独立真实 ......

[ngModelOptions]="{standalone: true}"
Run Code Online (Sandbox Code Playgroud)

有关详细信息,此处查看Angular部分中的ng_model


小智 85

您需要导入FormsModule

打开app.module.ts

并添加行

import { FormsModule } from '@angular/forms';
Run Code Online (Sandbox Code Playgroud)

@NgModule({
imports: [
   FormsModule
],
})
Run Code Online (Sandbox Code Playgroud)

  • 这工作完美,只是在CLI生成的项目上的Angular 6上进行了测试 (2认同)

Aru*_*rul 50

在要使用 [(ngModel)] 的那些模块中导入 FormsModule

在此处输入图片说明


Kho*_*Phi 49

投掷这可能会帮助某人.

假设你已经创建了一个新的NgModule,说AuthModule专门处理您的验证需求,确保导入FormsModule该AuthModule .

如果您将FormsModuleAuthModule当时使用ONLY,则无需导入FormModuleIN默认值AppModule

所以这样的事情在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 { }
Run Code Online (Sandbox Code Playgroud)

AppModule如果你不使用FormsModule其他任何地方,请忘记导入.


Tha*_*han 40

您需要导入FormsModule.

打开app.module.ts并添加行

import { FormsModule } from '@angular/forms';
Run Code Online (Sandbox Code Playgroud)

@NgModule({
    imports: [
       FormsModule
    ],
})
Run Code Online (Sandbox Code Playgroud)

添加 Angular 表单模块

  • 100% 需要导入 FormsModule。为我解决了问题。 (3认同)

Sha*_*pta 37

简单的 灵魂:在app.module.ts

import {FormsModule} from "@angular/forms";  
// add in imports 

imports: [
 BrowserModule,
 FormsModule
 ],
Run Code Online (Sandbox Code Playgroud)

例2:

如果你想使用[(ngModel)],你必须在app.module.ts中导入FormsModule

import { FormsModule  } from "@angular/forms";     
@NgModule({
  declarations: [
    AppComponent, videoComponent, tagDirective, 
  ],
  imports: [
    BrowserModule,  FormsModule

  ],
  providers: [ApiServices],
  bootstrap: [AppComponent]
})
export class AppModule { }
Run Code Online (Sandbox Code Playgroud)

  • 这两个例子的区别究竟在哪里? (26认同)

小智 36

要摆脱此错误,您需要遵循两个步骤

  1. 在您的应用模块中导入FormsModule
  2. 将其作为@NgModule装饰器中的导入值传递

app.module.ts基本上如下所示:

    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 { }
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你


Wap*_*vam 27

您需要导入FormsModule您在模块如果此组件是根,即app.module.ts

请打开app.module.ts

@ angular / forms导入FormsModule

例如:

import { FormsModule } from '@angular/forms';
Run Code Online (Sandbox Code Playgroud)

@NgModule({
imports: [
   FormsModule
],
})
Run Code Online (Sandbox Code Playgroud)


Sha*_*dit 22

在您的app模块中导入FormsModule.

它会让你的应用程序运行良好.

import { NgModule }      from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import {ContactListCopmponent} from './contacts/contact-list.component';
import { FormsModule }   from '@angular/forms';

import { AppComponent }  from './app.component';

@NgModule({
  imports: [
    BrowserModule,
    FormsModule
  ],
  declarations: [
    AppComponent,ContactListCopmponent
  ],
  bootstrap: [ AppComponent ]
})
export class AppModule { }
Run Code Online (Sandbox Code Playgroud)


iGh*_*ost 20

如果你需要使用[(ngModel)]第一你需要导入FormsModuleapp.module.ts,然后在进口的列表中添加.像这样的东西:

app.module.ts

  1. 进口 import {FormsModule} from "@angular/forms";
  2. 添加进口 imports: [ BrowserModule, FormsModule ],

app.component.ts

  1. 例: <input type="text" [(ngModel)]="name" >
  2. 然后 <h1>your name is: {{name}} </h1>


小智 19

我正在使用Angular 7

我必须导入ReactiveFormsModule,因为我正在使用FormBuilder类创建反应形式。

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

@NgModule({
  imports: [
    CommonModule,
    FormsModule,
    ReactiveFormsModule
  ], declarations: []})
Run Code Online (Sandbox Code Playgroud)


小智 17

在文件app.module 中导入FormModule

import { FormsModule } from '@angular/forms'; [...] @NgModule({ imports: [ [...] FormsModule ], [...] })
Run Code Online (Sandbox Code Playgroud)


ren*_*hlf 16

我正在使用Angular 5.

就我而言,我也需要导入RactiveFormsModule.

app.module.ts(或anymodule.module.ts)

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

@NgModule({
  imports: [
    CommonModule,
    FormsModule,
    ReactiveFormsModule
  ],
Run Code Online (Sandbox Code Playgroud)

  • 只有这个答案解决了Angular 5中的问题 (2认同)

小智 16

您需要在 app.module.ts 中导入 FormsModule 并添加以下行

 import { FormsModule } from '@angular/forms';
    @NgModule({
      imports: [
       
        FormsModule
      ]
    })
Run Code Online (Sandbox Code Playgroud)

FormsModule 中声明的 ngModel 指令允许您将模板驱动表单中的控件绑定到数据模型中的属性。当您使用双向数据绑定语法 [(ngModel)] 包含指令时,Angular 可以跟踪控件的值和用户交互,并使视图与模型保持同步。

  • 这个答案与 2016 年的答案相比没有增加任何价值:[答案#1](/sf/answers/2722612441/),[答案#2](/sf/answers/2722752861/) /1951524),[答案#3](/sf/answers/2777366301/) (2认同)

小智 15

如果有人在应用接受的解决方案后仍然出现错误,则可能是因为您在组件中有一个单独的模块文件,您要在其中使用输入标记中的ngModel属性.在这种情况下,也可以在组件的module.ts文件中应用已接受的解决方案.


mru*_*ova 13

如果您在正确导入FormsModule后仍然出现错误,请检查您的终端或(Windows控制台),因为您的项目没有编译(因为可能是其他任何错误)并且您的解决方案没有反映在您的浏览器中!

在我的情况下,我的控制台有以下无关的错误:类型'ApiService'上不存在属性'retrieveGithubUser'.


Mat*_*att 13

我知道这个问题是关于Angular 2的,但我在Angular 4上,这些答案都没有帮助.

在Angular 4中,语法需要

[(ngModel)]
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


小智 12

ngModel应该从@angular/forms导入,因为它是 FormsModule 的一部分。所以我建议你改变你的 app.module.ts 像这样:

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

[...]

@NgModule({
  imports: [
    [...]
    FormsModule
  ],
  [...]
})
Run Code Online (Sandbox Code Playgroud)

  • 这与之前的答案有何不同? (2认同)

Mal*_*wan 11

在模块中,您愿意使用ngModel,您必须导入FormsModule

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

@NgModule({
  imports: [
    FormsModule,
  ],

})
export class AbcModule { }
Run Code Online (Sandbox Code Playgroud)


Nae*_*hir 10

您需要导入 FormsModule。

#Open app.module.ts
#add the lines

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

@NgModule({
    imports: [
       FormsModule   <--------add this 
    ],
})


if you are using reactive form then also added  ReactiveFormsModule
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这个答案并没有给所选择的答案增加太多价值。 (3认同)
  • @FrancescoColamonici 或其他 17 个答案具有完全相同的解决方案。 (2认同)

Rzv*_*van 9

ngModel来自FormsModule.在某些情况下,您可能会收到此类错误:

  1. 您没有将FormsModule导入到声明组件的模块的导入数组中,使用ngModel的组件.
  2. 您已将FormsModule导入到一个继承另一个模块的模块中.在这种情况下,您有两个选择:
    • 让FormsModule从两个模块导入到导入数组中:module1和module2.作为规则:导入模块不提供对其导入模块的访问.(不继承导入)

在此输入图像描述

  • 将FormsModule声明为module1中的导入和导出数组,以便能够在model2中看到它

在此输入图像描述

  1. (在某些版本中我遇到了这个问题)您已正确导入FormsModule但问题出在输入HTML标记上.您必须为输入添加名称标记属性,并且[(ngModel)]中的对象绑定名称必须与名称属性中的名称相同

    在此输入图像描述


Vic*_*har 9

ngModule您需要导入的时候FormsModule,因为ngModel是来自FormsModule。请像我分享的以下代码一样修改您的app.module.ts

import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';

@NgModule({
    declarations: [
         AppComponent,
         HomeComponent
    ],
    imports: [
         BrowserModule,
         AppRoutingModule,
         FormsModule
    ],
    bootstrap: [AppComponent]
})
export class AppModule { }
Run Code Online (Sandbox Code Playgroud)


Wil*_*idi 8

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

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


Ana*_*aja 8

ngModel是FormsModule的一部分。并且应该从@ angular / forms导入以与ngModel一起使用。

请按以下方式更改app.module.ts:

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

[...]

@NgModule({
  imports: [
    [...]
    FormsModule
  ],
  [...]
})
Run Code Online (Sandbox Code Playgroud)


Min*_*tta 7

对于我的场景,我必须将[CommonModule]和[FormsModule]都导入到我的模块中

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

import { MyComponent } from './mycomponent'

@NgModule({
    imports: [
        CommonModule,
        FormsModule
    ],
    declarations: [
        MyComponent 
    ]
 }) 
export class MyModule { }
Run Code Online (Sandbox Code Playgroud)


小智 7

您需要导入FormsModule

打开app.module.ts

并添加行

import { FormsModule } from '@angular/forms';
Run Code Online (Sandbox Code Playgroud)

@NgModule({
imports: [
   FormsModule
],
})
Run Code Online (Sandbox Code Playgroud)

  • 这是[PRao的答案]的100%批发副本(/sf/ask/2722494001/ #52675849)(当时的[修订版 2](https://stackoverflow.com/revisions/52675849/2))。 (2认同)

gan*_*045 7

有时,如果我们已经导入了BrowserModuleFormsModule但我遇到了同样的错误,但其他相关的模块,则我意识到我们需要将它们导入Order中,在我的情况下,我错过了它。所以顺序应该是这样 BrowserModuleFormsModuleReactiveFormsModule

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

@NgModule({
  imports: [
    BrowserModule,
    FormsModule,
    ReactiveFormsModule     
  ],
  providers: [],
  declarations: [
    AppComponent
  ],
  bootstrap: [AppComponent]
})
export class AppModule {}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助某人.. :)

  • 2021 年报告中提到,“FormsModule”**必须**在“NgModule”之后导入。否则就会出现这个错误。这是唯一一个提到订单重要性的答案! (5认同)
  • 您的导入数组中有 ReactiveFormsModule,但导入中没有。只是说。 (2认同)

Ahm*_*bib 7

我遇到了同样的问题,原因是我在我的MenuComponent. 我导入了我的MenuComponent in app.module.ts,但我忘记声明它。

错误

声明 MenuComponent 解决了我的问题。即,如下图所示:

已解决问题


Jam*_*ose 6

这适用于使用普通JavaScript而不是Type Script的人们。除了引用页面顶部的表单脚本文件外,如下所示

<script src="node_modules/@angular/forms/bundles/forms.umd.js"></script>
Run Code Online (Sandbox Code Playgroud)

您还应该告诉模块加载器加载ng.forms.FormsModule。进行更改后importsNgModule方法的属性如下所示

imports: [ng.platformBrowser.BrowserModule, ng.forms.FormsModule],

编码愉快!


Gun*_*ram 6

当您尝试在不同模块中使用未共享的模块中的组件时,有时会出现此错误.

例如,你有2个模块与module1.componentA.component.ts和module2.componentC.component.ts,你尝试在module2内的模板中使用module1.componentA.component.ts中的选择器(例如<module1-componentA [someInputVariableInModule1]="variableFromHTTPRequestInModule2">),它会抛出someInputVariableInModule1在module1.componentA.component.ts中不可用的错误 - 即使你@Input() someInputVariableInModule1在module1.componentA中也有.

如果发生这种情况,您希望共享module1.componentA以便在其他模块中可访问.因此,如果您在sharedModule中共享module1.componentA,则module1.componentA将在其他模块(在module1之外)中可用,并且导入sharedModule的每个模块将能够在其模板中访问注入@Input()声明的变量的选择器.

  • 所以要回答自己,这就是你共享模块的方法https://angular-2-training-book.rangle.io/handout/modules/shared-di-tree.html (2认同)
  • 嘿抱歉,我没有快速看到你的评论:)是的,这就是你如何创建一个SharedModule并在那里导入你自己的模块,你想在其他多个模块中使用它们.然后导入要在共享模块中导入的模块的SharedModule. (2认同)

小智 6

对我来说,问题是,我忘记在模块的声明数组中声明该组件。

@NgModule({
 declarations: [yourcomponentName]
})
Run Code Online (Sandbox Code Playgroud)


小智 6

实际上在大多数情况下FormsModule已经进口了。所以你必须做的是你必须确保

  1. 您的组件已正确添加到 app.module.ts 文件的声明数组中。
  2. 您应该验证绑定的拼写是否正确。正确的拼写是[(ngModel)]


Jor*_*app 5

当我第一次做这个教程时,main.ts 看起来与现在略有不同。它看起来非常相似,但请注意不同之处(最上面的是正确的)。

正确的:

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app.module';

platformBrowserDynamic().bootstrapModule(AppModule);
Run Code Online (Sandbox Code Playgroud)

旧教程代码:

import { bootstrap }    from '@angular/platform-browser-dynamic';
import { AppComponent } from './app.component';
bootstrap(AppComponent);
Run Code Online (Sandbox Code Playgroud)


Rot*_*ots 5

我从RC1升级到RC5,并收到此错误。

我完成了迁移(基于Angular2快速入门示例app.module.ts,引入了一个新文件,更改package.json为包括新版本和缺少的模块,最后更改main.ts为相应地启动)。

我先做了一次npm update,然后再一次npm outdated确认安装的版本正确,但是仍然没有运气。

我最终完全清除了该node_modules文件夹,然后重新安装npm install-Voila!问题解决了。


Sid*_*ota 5

对于 Angular 2 的任何版本,您都需要在 app.module.ts 文件中导入 FormsModule,它会解决问题。


she*_*der 5

结合所有可能的解决方案:

  1. 检查您输入的内容是否正确。它应该是“[(ngModel)]”,“M”大写。
  2. 检查你的 TS 文件中是否有 import FormsModule。如果没有,你可以这样做:

在 app.module.ts 中,添加以下行

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

@NgModule({
  declarations: [
  ],
  imports: [
    xyz,
    abc,
    FormsModule
  ],
})
Run Code Online (Sandbox Code Playgroud)


Ωme*_*Man 5

Angular 14+ 使用独立组件

将表单组件直接导入到独立组件中:

import { FormsModule, NgForm } from '@angular/forms';
import { NgFor } from "@angular/common";

@Component({
  selector: 'app-table-view',
  standalone: true,
  imports: [ 
    NgFor,
    FormsModule
    ],  
  templateUrl: './table-view.component.html',
  styleUrls: ['./table-view.component.css']
})
Run Code Online (Sandbox Code Playgroud)