没有将“exportAs”设置为“ngForm”的指令

Posted

技术标签:

【中文标题】没有将“exportAs”设置为“ngForm”的指令【英文标题】:There is no directive with "exportAs" set to "ngForm" 【发布时间】:2017-05-18 17:49:43 【问题描述】:

当我尝试测试LoginComponent时出现以下错误

PhantomJS 2.1.1 (Linux 0.0.0): Executed 3 of 55 (1 FAILED) (0 secs / 0.307 secs)
PhantomJS 2.1.1 (Linux 0.0.0) LoginComponent should create FAILED
Failed: Uncaught (in promise): Error: Template parse errors:
There is no directive with "exportAs" set to "ngForm" ("iv class="col-md-4 col-sm-6 col-md-offset-4 col-sm-offset-3">
          <form (ngSubmit)="login(f)" [ERROR ->]#f="ngForm">
            <div class="card card-login">
              <div class="card-header text-cen"): LoginComponent@5:38

我的组件看起来像的一部分,

login.component.ts

export class LoginComponent 

  isBusy: boolean = false;
  user: User;

  constructor(
    private router: Router,
    private notificationService: NotificationService,
    private authService: AuthenticationService,
    private sessionService: SessionService,
  )  
  ....

相应的规范看起来像,

login.component.spec.ts

describe('LoginComponent', () => 
  let component: LoginComponent;
  let fixture: ComponentFixture<LoginComponent>;

  beforeEach(async(() => 
    let routerStub = new RouterStub();

    TestBed.configureTestingModule(
      imports: [HttpModule],
      declarations: [,
        LoginComponent
      ],
      providers: [
        provide: Http, useFactory: (backend, options) => 
          return new Http(backend, options);
        ,
        deps: [MockBackend, BaseRequestOptions]
      ,
       provide: Router, useClass: class  navigate = jasmine.createSpy("navigate");  ,
        MockBackend,
        BaseRequestOptions,
        AuthenticationService,
        SessionService,
        NotificationService
      ],
      schemas: [NO_ERRORS_SCHEMA],
    )
    .compileComponents();
  ));

  beforeEach(() => 
    fixture = TestBed.createComponent(LoginComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  );

  it('should create', () => 
    expect(component).toBeTruthy();
  );
);

似乎无法使用上述提供者、声明等创建假组件。像other's said,我已经在@NgModule 装饰器中包含了FormsModule

【问题讨论】:

【参考方案1】:

不确定您将它添加到哪个 @NgModule 装饰器中,但我认为应该添加它

 TestBed.configureTestingModule(
      imports: [HttpModule, FormsModule],

【讨论】:

我想动态地为一个元素添加一个属性.. 所以我尝试了.. &lt;input type="input.type" name="input.name" class="form-control" [attr.disabled]="input.disabled" value="input.value"&gt; 但它生成了&lt;input .. disable="true"&gt; 但我想要&lt;input disable&gt; 基于input.disabled 的布尔值 您不能只使用 Angular2 绑定创建 disabled,但 disableddisabled="true" 应该无关紧要。要删除它,您需要null,因为false 将导致disabled="false" 类似于disabled[attr.disabled]="input.disabled ? true : null" 应该做你想做的事。 感谢这个答案的帮助。 谢谢伙计,只是为了像我这样的超级愚蠢的家伙,您确实需要在文件顶部添加 import FormsModule from '@angular/forms'; 的 FormsModule @superjisan 是的,一切都需要导入,所以我没有明确添加。我假设 IDE 建议无论如何添加导入,但这可能取决于 IDE。【参考方案2】:

我遇到了完全相同的问题,我通过在 app.module.ts 和组件所在的子模块(在我的例子中是 core.module.ts)中导入 FormsModule 来解决它。

我遵循 Angular 风格指南并将登录组件放在核心模块中,所以我的登录组件的文件夹结构是:app/src/core/login/login.component.ts

我不需要像其他人建议的那样导入 ReactiveFormsModule。

【讨论】:

【参考方案3】:

被屏蔽为接受的答案目前已过时,因为 HttpModule 目前已被弃用。另一种方法是使用 HttpClientTestingModule

 TestBed.configureTestingModule(
      imports: [HttpClientTestingModule, FormsModule],

【讨论】:

以上是关于没有将“exportAs”设置为“ngForm”的指令的主要内容,如果未能解决你的问题,请参考以下文章

没有将“exportAs”设置为“ngForm”的指令

Angular 4中的模板解析错误“没有将exportAs设置为ngModel的指令”

Angular2(ngSubmit)不工作

没有找到 exportAs 'ngModel' 的指令。角 12

为啥 DragHandler exportAs Drag 禁用了我的 MouseMotionListener?

我可以在 Angular 4 的同一个组件中使用两个 ngForm 吗?