【问题标题】:无法绑定到“ngModel”,因为它不是“输入”的已知属性
【发布时间】:2016-12-17 23:32:20
【问题描述】:

我在启动我的 Angular 应用程序时遇到以下错误,即使该组件未显示。

我必须注释掉 <input> 才能让我的应用正常运行。

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: 

我正在查看 Hero plunker,但我看不出与我的代码有什么不同。

这是组件文件:

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";
}

【问题讨论】:

  • 什么是英雄采摘者?
  • 自从他们昨天更新到 rc5 后,我遇到了同样的问题(有趣的是,它对我的​​同事有用..)我认为 @abreneliere 正在谈论他们的教程 - angular.io/docs/ts/latest/tutorial
  • @DanielShillcock, Tour of Heroes plunker.
  • 是的,我提到了英雄之旅教程,因为它确实使用了 ngModel。
  • 我只是盯着 Angular,在做英雄之旅教程时看到了这个错误。果然,他们现在call this out in the very next line 并告诉你如何/为什么要纠正它。

标签: javascript angular typescript input


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    正确:

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

    旧教程代码:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        @NgModule({
         declarations: [yourcomponentName]
        })
        

        【讨论】:

          【解决方案5】:

          最近我发现这个错误不仅发生在你忘记在你的模块中导入 FormsModule 的情况下。就我而言,问题出在这段代码中:

          <input type="text" class="form-control" id="firstName"
                             formControlName="firstName" placeholder="Enter First Name"
                             value={{user.firstName}} [(ngModel)]="user.firstName">
          

          我通过更改 formControlName -> name

          来修复它
          <input type="text" class="form-control" id="firstName"
                             name="firstName" placeholder="Enter First Name"
                             value={{user.firstName}} [(ngModel)]="user.firstName">
          

          【讨论】:

          • 是的 Nikita 模板驱动的表单方法也需要“name”属性。例如,角度表单指令使用 name 属性来分配验证错误。
          【解决方案6】:

          YouTube 视频 Angular error can't bind to 'ngModel' since it isn't a known property of input 解释了如何实际解决这个问题。以下是相同的文字解释。

          Angular 错误“无法绑定到 'ngModel',因为它不是已知属性 '输入'”

          对上述错误消息的简单翻译是“ngModel”指令不被理解,需要加载必要的 Angular 模块以便语法正常工作。

          为了让“ngModel”指令在 HTML 中工作,我们需要从“@Angular/forms”导入“FormModules”。下面是另一种类似的错误,但与“FormsGroup”有关。在下面的例子中,我们应该加载 ReactiveFormsModule。

          模板解析错误:无法绑定到“formGroup”,因为它不是已知的 'form' 的属性。

          遇到上述错误时的小提示:您可以寻找 "[Error-->]" 文本,箭头指向 Angular 无法理解的指令.

          【讨论】:

            【解决方案7】:

            虽然答案解决了这个问题,但我想提供更多关于这个主题的信息,因为我在开始从事 Angular 项目时也遇到了这个问题。

            初学者应该了解有两种主要类型的表单。它们是反应式表单和模板驱动的表单。从Angular 2 开始,建议对任何类型的表单使用反应式表单

            反应式表单更健壮:它们更具可扩展性、可重用性和可测试性。如果表单是您的应用程序的关键部分,或者您已经在使用响应式模式来构建您的应用程序,请使用响应式表单。

            模板驱动的表单对于向应用程序添加简单的表单很有用,例如电子邮件列表注册表单。它们很容易添加到应用程序中,但它们的扩展性不如响应式表单。如果您有非常基本的表单要求和可以单独在模板中管理的逻辑,请使用模板驱动的表单。

            更多详情请参考Angular documents

            说到问题,[(ngModel)]="..." 基本上是一种绑定语法。为了在您的组件 HTML 页面中使用它,您应该在您的 NgModule 中导入 FormsModule(您的组件所在的位置)。现在[(ngModel)] 用于简单的双向绑定,或者在您的表单中用于任何输入 HTML 元素。

            另一方面,要使用响应式表单,请从 @angular/forms 包中导入 ReactiveFormsModule 并将其添加到 NgModule 的导入数组中。

            例如,如果我的组件 HTML 内容在任何 HTML 元素中都没有 [(ngmodel)],那么我不需要导入 FormsModule。

            在下面的示例中,我已经完全使用了响应式表单,因此我不需要在我的 NgModule 中使用 FormsModule。

            创建组模块:

            import { NgModule } from '@angular/core';
            import { CommonModule } from '@angular/common';
            import { GroupsRoutingModule, routedAccountComponents } from './groups-routing.module';
            import { ReactiveFormsModule } from '@angular/forms';
            import { SharedModule } from '../shared/shared.module';
            import { ModalModule } from 'ngx-bootstrap';
            @NgModule({
                declarations: [
                    routedAccountComponents
                ],
                imports: [
                    CommonModule,
                    ReactiveFormsModule,
                    GroupsRoutingModule,
                    SharedModule,
                    ModalModule.forRoot()
                ]
            })
            export class GroupsModule {
            }
            

            创建路由模块(分开主要代码和可读性):

            
            import { NgModule } from '@angular/core';
            import { Routes, RouterModule } from '@angular/router';
            import { GroupsComponent } from './all/index.component';
            import { CreateGroupComponent } from './create/index.component';
            
            const routes: Routes = [
              {
                path: '',
                redirectTo: 'groups',
                pathMatch: 'full'
              },
              {
                path: 'groups',
                component: GroupsComponent
              }
            ];
            
            
            @NgModule({
              imports: [RouterModule.forChild(routes)],
              exports: [RouterModule]
            })
            export class GroupsRoutingModule { }
            
            
            export const routedAccountComponents = [
              GroupsComponent,
              CreateGroupComponent
            ];
            
            

            CreateGroupComponent html 代码

            <form [formGroup]="form" (ngSubmit)="onSubmit()">
                    <label for="name">Group Name</label>
                    <div class="form-group">
                        <div class="form-line">
                            <input type="text" formControlName="name" class="form-control">
                        </div>
                    </div>
                </form>
            
            

            创建GroupComponent ts文件

            
            import { Component, OnInit, Output, EventEmitter } from '@angular/core';
            import { DialogResult } from 'src/app/shared/modal';
            import { FormGroup, FormControl, AbstractControl } from '@angular/forms';
            import { Subject } from 'rxjs';
            import { ToastrService } from 'ngx-toastr';
            import { validateAllFormFields } from 'src/app/services/validateAllFormFields';
            import { HttpErrorResponse } from '@angular/common/http';
            import { modelStateFormMapper } from 'src/app/services/shared/modelStateFormMapper';
            import { GroupsService } from '../groups.service';
            import { CreateGroup } from '../model/create-group.model';
            
            @Component({
                selector: 'app-create-group',
                templateUrl: './index.component.html',
                providers: [LoadingService]
            })
            
            export class CreateGroupComponent implements OnInit {
                public form: FormGroup;
                public errors: string[] = [];
                private destroy: Subject<void> = new Subject<void>();
            
                constructor(
                    private groupService: GroupsService,
                    private toastr: ToastrService
                ) { }
            
                private buildForm(): FormGroup {
                    return new FormGroup({
                        name: new FormControl('', [Validators.maxLength(254)])
                    });
                }
            
                private getModel(): CreateGroup {
                    const formValue = this.form.value;
                    return <CreateGroup>{
                        name: formValue.name
                    };
                }
            
                public control(name: string): AbstractControl {
                    return this.form.get(name);
                }
            
                public ngOnInit() {
                    this.form = this.buildForm();
                }
            
            
                public onSubmit(): void {
            
                     if (this.form.valid) {
                         // this.onSubmit();
                         //do what you need to do
                     }
                }
            }
            
            

            我希望这有助于开发人员了解为什么以及何时需要使用 FormsModule

            【讨论】:

              【解决方案8】:

              即使FormsModule是在功能模块中直接或间接(例如从共享模块)导入,如果declarations上没有声明导入的组件,也会发生此错误:

              我学习了 Deborah Kurata 的 Angular Routing 课程。当我在 Angular Route 的 component 属性上添加导入的组件 ProductEditInfoComponent 时,我忘记在 declarations 属性上添加 ProductEditInfoComponent。

              在声明属性上添加 ProductEditInfoComponent 将解决 NG8002: Can't bind to 'ngModel' because it is not an known property of 'input'. 问题:

              【讨论】:

                【解决方案9】:

                我在运行 Angular 测试时遇到了同样的错误,因为 FormsModule 没有添加到规范文件中。

                我们需要将它添加到所有规范文件中,而为了让应用程序成功运行,我们将在 app.module.ts 文件中的一处添加。

                【讨论】:

                  【解决方案10】:

                  实际上,在大多数情况下,FormsModule 已经被导入。所以你要做的是你必须确保

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

                  【讨论】:

                    【解决方案11】:

                    确保对于模板驱动的表单方法 (https://angular.io/guide/forms),正如 @Nikita Sychou 已经提到的,您已经使用“名称”属性修饰了输入字段,例如

                    <form>
                       <input [(ngModel)]="form.email" name="email"></input>
                    

                    并且 FormsModule 已被导入关联的@NgModule。两者都是避免“无法绑定到 ngModel”错误的先决条件。如果您的 IDE 中仍然出现样式错误,例如IntelliJ 抱怨 ngModel 指令只是忽略它们.. 你很高兴:-)

                    【讨论】:

                      【解决方案12】:

                      您需要导入 FormsModule

                      打开app.module.ts

                      并添加一行

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

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

                      【讨论】:

                      【解决方案13】:

                      import { FormsModule } from '@angular/forms';
                      
                      @NgModule({
                        imports: [
                      
                          FormsModule
                        ],
                      
                      })

                      【讨论】:

                      • 这与之前的答案有何不同?
                      【解决方案14】:

                      注意:请记住,ngModel 指令被定义为 Angular FormsModule 的一部分,您需要在要使用它的 Angular 模块元数据的 imports: [...] 部分中包含 FormsModule。

                      【讨论】:

                        【解决方案15】:

                        此错误的主要原因是您忘记在 app.module.ts 中导入 FormsModule。

                        但有时在大型项目中,您可能会忘记在其模块中添加组件并遇到此错误。

                        【讨论】:

                          【解决方案16】:

                          在您可以在 Angular 中使用两种方式绑定之前,您需要将 FormsModule 包导入到您的模块中。

                          您可以像这样将 FormsModule 添加到模块(例如 app.module.ts)内的导入数组中。

                          import { FormsModule } from '@angular/forms';
                          
                          @NgModule({
                            imports: [
                              ...,
                              FormsModule     <-------
                            ],
                            [...]
                          })
                          

                          【讨论】:

                            【解决方案17】:

                            我正在使用 Angular 9,并且我有一个带有 [formGroup] 属性的“

                            我通过仅删除 (ngModel) 部分解决了错误。

                            【讨论】:

                              【解决方案18】:

                              即使我如上所述添加了 FormsModule,我也遇到了同样的错误。所以只需简单的重启即可完成这项工作。

                              【讨论】:

                                【解决方案19】:

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

                                 import { FormsModule } from '@angular/forms';
                                    @NgModule({
                                      imports: [
                                       
                                        FormsModule
                                      ]
                                    })
                                

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

                                【讨论】:

                                  猜你喜欢
                                  • 1970-01-01
                                  • 2021-09-20
                                  • 2016-12-18
                                  • 2016-12-17
                                  • 1970-01-01
                                  • 2017-04-16
                                  • 2017-11-30
                                  • 2017-01-27
                                  相关资源
                                  最近更新 更多