TypeScript-的Angular Framework错误-“没有将exportAs设置为ngForm的指令”


226

使用TypeScript的Angular2-forms框架时,我不断收到此错误:

没有directive将“ exportAs”设置为“ ngForm”的情况

这是我的代码

项目依赖项:

  "dependencies": {
    "@angular/common": "2.0.0-rc.6",
    "@angular/compiler": "2.0.0-rc.6",
    "@angular/core": "2.0.0-rc.6",
    "@angular/forms": "2.0.0-rc.6",
    "@angular/http": "2.0.0-rc.6",
    "@angular/platform-browser": "2.0.0-rc.6",
    "@angular/platform-browser-dynamic": "2.0.0-rc.6",
    "@angular/router": "3.0.0-rc.2",
    "ng2-bootstrap": "^1.1.1",
    "reflect-metadata": "^0.1.8",
    "core-js": "^2.4.0",
    "es6-module-loader": "^0.17.8",
    "rxjs": "5.0.0-beta.11",
    "systemjs": "0.19.27",
    "zone.js": "0.6.17",
    "jquery": "3.0.0",
  }

这是登录模板:

<form #loginForm="ngForm" (ng-submit)="authenticate(loginForm.value)">
</form>

...以及登录组件:

import { Component } from '@angular/core';
import {Http, Headers}  from '@angular/http';
@Component({
    moduleId: module.id,
    selector: 'login-cmp',
    templateUrl: 'login.component.html'
})
export class LoginComponent {
  constructor($http: Http) {
    this.$http = $http;
  }
  authenticate(data) {
   ... 
  }
}

我有这个错误:

zone.js?1474211973422:484 Unhandled Promise rejection: Template parse errors:    
There is no directive with "exportAs" set to "ngForm" ("
            <form [ERROR ->]#loginForm="ngForm" 
(ngsubmit)="authenticate(loginForm.value)">

Answers:


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

@NgModule({
  imports: [
             BrowserModule,

             FormsModule      //<----------make sure you have added this.
           ],
  ....
})

32
我已经做到了,但仍然出现错误。还有其他想法吗?(我正在使用发行版。)
David Pfeffer,

30
必须绑定到<form>元素
流行

6
@pop谢谢,正在将其添加到div它并导致此错误。
Arg0n

1
谢谢,我一直忘了这要放在imports数组中,而不是放在providers数组中
TetraDev

9
我的问题通过在模块中添加ReactiveFormsModule解决。
Mohammad Mirzaeyan

50

您不仅必须导入FormsModule根AppModule,而且还必须导入使用任何角度形式指令的每个子模块

// SubModule A

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

@NgModule({
  imports: [
    CommonModule,
    FormsModule      //<----------make sure you have added this.
  ],
  ....
})

1
您可以添加到导出数组,然后无需将其添加到多个子模块导入中
Samih A

@SamihA请举例说明,导出数组放在AppModule还是子模块A中?
TetraDev '18年

同样不要忘记导入ReactiveFormsModule
Snedden27 '18

为我工作-但我发现直到我杀死npm并重新运行npm run start之前,它都无法清除错误。
Dovev Hefetz '18

45

我知道这是一篇旧文章,但我想分享我的解决方案。我在imports []数组中添加了“ ReactiveFormsModule ” 来解决此错误

错误:没有将“ exportAs”设置为“ ngForm”(“

固定:

module.ts

从“ @ angular / forms” 导入{FormsModule,ReactiveFormsModule }

 imports: [
    BrowserModule,
    FormsModule , 
    ReactiveFormsModule
  ],


8

(以防万一有人像我一样瞎了) form FTW!确保使用<form>标签

不会工作:

<div (ngSubmit)="search()" #f="ngForm" class="input-group">
    <span class="input-group-btn">
      <button class="btn btn-secondary" type="submit">Go!</button>
    </span>
    <input type="text" ngModel class="form-control" name="search" placeholder="Search..." aria-label="Search...">
</div>

像魅力一样工作:

 <form (ngSubmit)="search()" #f="ngForm" class="input-group">
            <span class="input-group-btn">
              <button class="btn btn-secondary" type="submit">Go!</button>
            </span>
            <input type="text" ngModel class="form-control" name="search" placeholder="Search..." aria-label="Search...">
</form>

6

如果这样分配名称:

#editForm="testForm"

... exportAs必须在组件装饰器中定义:

selector: 'test-form',
templateUrl: './test-form.component.html',
styleUrls: ['./test-form.component.scss'],
exportAs: 'testForm'

当接受的解决方案不起作用时,这对我有用。
ir0h

确认除了接受的解决方案之外,还必须执行此操作
hello_earth

5

检查是否导入FormsModule。新形式的angular 2发布版本中没有ngControl。您必须将模板更改为示例

<div class="row">
    <div class="form-group col-sm-7 col-md-5">
        <label for="name">Name</label>
        <input type="text" class="form-control" required
               [(ngModel)]="user.name"
               name="name" #name="ngModel">
        <div [hidden]="name.valid || name.pristine" class="alert alert-danger">
            Name is required
        </div>
    </div>
</div>

3

你要注意的两件事。

  1. 如果使用子模块,则必须在该子模块中导入FormModule。

            **imports:[CommonModule,HttpModule,FormsModule]**
  2. 您必须在模块中导出FormModule

        **exports:[FormsModule],**

    因此看起来就像 导入:[CommonModule,HttpModule,FormsModule],导出:[FormsModule],

  3. 在顶部,您必须导入FormsModule

    从“ @ angular / forms”导入{FormsModule};


如果仅使用app.module.ts,则

无需出口..仅需进口


1
如果在自己的模块中使用FormsModule,则在xxxx.modules.ts中需要以下内容。从Angular导入表单: import { FormsModule } from '@angular/forms'; 将其添加到导入数组NgModule:@NgModule({ imports: [ FormsModule ],
Koen van der


2

除了在登录组件ts文件中导入表单模块外,还需要导入NgForm。

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

这解决了我的问题


我得到这个错误:未捕获的错误:意外指令“NgForm”由模块进口
斯特芬李可染拉尼Ĵ

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

imports:[
    BrowserModule.withServerTransition({ appId: 'ng-cli-universal' }),
    HttpClientModule,
    FormsModule,
    ReactiveFormsModule/*This one in particular*/,...
],

在app.module.ts中永久解决错误"cannot bind [formGroup] or no directive with export as"


1

同样由于相同的原因,我一次又一次地提出同样的问题。因此,让我通过说我在做什么错来回答这个问题。可能对某人有帮助。

我正在通过angular-cli命令创建组件

ng gc组件/某物/某物

它所做的就是根据需要创建了组件。

同样,在创建组件时,它在App Module的声明数组中添加了该组件

在这种情况下,请删除它。和瞧!它可能会起作用。




0

您应该使用ctrl + c终止应用程序,并使用ng serve重新运行它,如果您没有在应用程序中包含FormsModule。module文件会导入数组,然后再添加它,angular不知道,它不会重新扫描模块,您应该重新启动应用程序,以便angular在包含模板驱动方法的所有功能之后可以看到包含新模块



0

这个

<div #myForm="ngForm"></div>

也可能导致错误,可以通过包含ngForm指令来修复。

<div ngForm #myForm="ngForm"></div>

0

我刚刚移动了路由模块,即在模块导入数组中的FormsModule和ReactiveFormsModule上方以及CommonModule之后说ARoutingModule。


0

只需导入正确的模块,

“ FormsModule”

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

0

如果尝试使用茉莉花成角度编写单元测试用例,也会发生此错误。

此错误的基本概念是import FormsModule。因此,在单元测试文件中,我们添加导入Section并将FormsModule放置在该文件下的

    TestBed.configureTestingModule
    For eg: 
    TestBed.configureTestingModule({
        declarations: [ XYZComponent ],
        **imports: [FormsModule]**,
    }).compileComponents();

-3

我有同样的问题,并通过使用以下命令更新所有依赖项(package.json)来解决 npm update -D && npm update -S

正如@GünterZöchbauer指出的那样,请确保首先包含FormsModule。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.