Angular2 问题:没有将“exportAs”设置为“ngForm”的指令

Posted

技术标签:

【中文标题】Angular2 问题:没有将“exportAs”设置为“ngForm”的指令【英文标题】:Angular2 issue: There is no directive with “exportAs” set to “ngForm” 【发布时间】:2018-01-16 15:24:43 【问题描述】:

我正面临这个令人沮丧的问题

没有将“exportAs”设置为“ngForm”的指令(“ ]#f="ngForm" (ngSubmit)="onSubmit(f)" class="form-horizo​​ntal"> "): ng:///ComponentsModule/EquipeComponent.html@8:12 错误:模板解析错误: 没有将“exportAs”设置为“ngForm”的指令(“ ]#f="ngForm" (ngSubmit)="onSubmit(f)" class="form-horizo​​ntal"> "): ng:///ComponentsModule/EquipeComponent.html@8:12

这是我的 app.module.ts 包含的内容

import  BrowserModule  from '@angular/platform-browser';
import  NgModule  from '@angular/core';
import  LocationStrategy, HashLocationStrategy  from '@angular/common';
import  NgForm  from '@angular/forms';
import  FormsModule, ReactiveFormsModule    from '@angular/forms';

import  AppComponent  from './app.component';
import  BsDropdownModule  from 'ngx-bootstrap/dropdown';
import  TabsModule  from 'ngx-bootstrap/tabs';
import  NAV_DROPDOWN_DIRECTIVES  from './shared/nav-dropdown.directive';

import  ChartsModule  from 'ng2-charts/ng2-charts';
import  SIDEBAR_TOGGLE_DIRECTIVES  from './shared/sidebar.directive';
import  AsideToggleDirective  from './shared/aside.directive';
import  BreadcrumbsComponent  from './shared/breadcrumb.component';

// Routing Module
import  AppRoutingModule  from './app.routing';

// Layouts
import  FullLayoutComponent  from './layouts/full-layout.component';
import  SimpleLayoutComponent  from './layouts/simple-layout.component';

@NgModule(
  imports: [
    BrowserModule,
    AppRoutingModule,
    BsDropdownModule.forRoot(),
    TabsModule.forRoot(),
    ChartsModule,
    FormsModule,
    ReactiveFormsModule                        
  ],
  declarations: [
    AppComponent,
    FullLayoutComponent,
    SimpleLayoutComponent,
    NAV_DROPDOWN_DIRECTIVES,
    BreadcrumbsComponent,
    SIDEBAR_TOGGLE_DIRECTIVES,
    AsideToggleDirective,
  ],
  providers: [
    provide: LocationStrategy,
    useClass: HashLocationStrategy
  ],
  bootstrap: [ AppComponent ]
)
export class AppModule  

我几乎是 Angular2 的新手,所以我无法弄清楚我的代码有什么问题。

这是equipe.component.html

的内容
<div class="animated fadeIn">
    <div class="row">
        <div class="col-md-12">
            <div class="card">
                <div class="card-header">
                    <strong>Ajout Equipe</strong>
                </div>
                <div class="card-block">
                    <form #f="ngForm" (ngSubmit)="onSubmit(f)" class="form-horizontal">
                        <div class="form-group row">
                            <label class="col-md-3 form-control-label" for="text-input">Nom Equipe</label>
                            <div class="col-md-9">
                                <input type="text" id="text-input" name="text-input" class="form-control" placeholder="Saisir le nom de l'equipe" required>
                            </div>
                            <div class="form-group row">
                                <label class="col-md-3 form-control-label" for="textarea-input">Description</label>
                                <div class="col-md-9">
                                    <textarea id="textarea-input" name="textarea-input" rows="9" class="form-control" placeholder="Description de l'equipe"></textarea>
                                </div>
</div>
                        </div>
                    </form>
                    </div>
                    <div class="card-footer">
                        <button type="submit" class="btn btn-sm btn-primary pull-right"><i class="fa fa-dot-circle-o"></i> Ajouter</button>
                    </div>
                </div>
            </div><!--/.col-->
        </div><!--/.row-->
    </div>

这是equipe.component.ts的内容:

import  Component  from '@angular/core';
import  NgForm from '@angular/forms';
import  FormsModule  from '@angular/forms';
import  BrowserModule  from '@angular/platform-browser';

@Component(
templateUrl: 'equipe.component.html',
)
export class EquipeComponent 

constructor()  
onSubmit(f:NgForm) 
console.log('this is a test');


这是我的ComponentsModule

的内容
import  NgModule  from '@angular/core';

import  ButtonsComponent  from './buttons.component';
import  CardsComponent  from './cards.component';

// Forms Component
import  FormsComponent  from './forms.component';
import  BsDropdownModule  from 'ngx-bootstrap/dropdown';

import  SocialButtonsComponent  from './social-buttons.component';
import  SwitchesComponent  from './switches.component';
import  TablesComponent  from './tables.component';

// Modal Component
import  ModalModule  from 'ngx-bootstrap/modal';
import  ModalsComponent  from './modals.component';

// Tabs Component
import  TabsModule  from 'ngx-bootstrap/tabs';
import  TabsComponent  from './tabs.component';
// Ressource Component
import  RessourceComponent  from './ressource.component';
// Equipe Component
import  EquipeComponent  from './equipe.component';
// Components Routing
import  ComponentsRoutingModule  from './components-routing.module';

@NgModule(
imports: [
ComponentsRoutingModule,
BsDropdownModule.forRoot(),
ModalModule.forRoot(),
TabsModule
],
declarations: [
ButtonsComponent,
CardsComponent,
FormsComponent,
ModalsComponent,
SocialButtonsComponent,
SwitchesComponent,
TablesComponent,
TabsComponent,
RessourceComponent,
EquipeComponent
]
)
export class ComponentsModule  

【问题讨论】:

问题出在您的 HTML 中。 #f="ngForm" 。 # 是在模板中将事物导出为变量的别名,而您没有正确使用它。 @JasonSpradlin 我正在关注这个documentation 能否请您在 HTML 中使用表单的地方显示您的代码? ,即使我遵循此文档,但在我的情况下一切正常 @JasonSpradlin 我已经添加了我的 HTML 代码 您在哪个@NgModule 中声明了EquipeComponent 【参考方案1】:

必须导入FormsModule 或其他导出FormsModule 的模块到 @NgModule 其中EquipeComponent 已被声明

@NgModule(
  imports: [
    FormsModule,
    // or SharedModule that exports FormsModule
    ...
  ],
  declarations: [
    EquipeComponent,
    SomeComponent
  ]
)
export class ComponentsModule 

在前面的代码中,Angular 将使用 SomeComponent 指令和其他模块导出的所有指令编译 EquipeComponent 模板

export const TEMPLATE_DRIVEN_DIRECTIVES: Type<any>[] = [NgModel, NgModelGroup, NgForm];
                                                                                ^^^^^
@NgModule(
  declarations: TEMPLATE_DRIVEN_DIRECTIVES,
  providers: [RadioControlRegistry],
  exports: [InternalFormsSharedModule, TEMPLATE_DRIVEN_DIRECTIVES]
                                              ^^^^^^^^^^^^
)
export class FormsModule 


@Directive(
  ...
  exportAs: 'ngForm'
)
export class NgForm extends ControlContainer implements Form 

另见

Angular 2 Use component from another module

【讨论】:

添加声明后我收到此错误错误错误:未捕获(承诺中):错误:类型 EquipeComponent 是 2 个模块声明的一部分:AppModule 和 ComponentsModule!请考虑将 EquipeComponent 移至导入 AppModule 和 ComponentsModule 的更高模块。您还可以创建一个新的 NgModule,它导出并包含 EquipeComponent,然后在 AppModule 和 ComponentsModule 中导入该 NgModule。 错误:EquipeComponent 类型是 2 个模块声明的一部分:AppModule 和 ComponentsModule!请考虑将 EquipeComponent 移至导入 AppModule 和 ComponentsModule 的更高模块。您还可以创建一个新的 NgModule,它导出并包含 EquipeComponent,然后在 AppModule 和 ComponentsModule 中导入该 NgModule。 我在我的 app.module.ts 中添加了声明 @IbrahimMAATKI Import FormsModule into ComponentsModule 从 AppModule 中移除 EquipeComponent 我没看到你在哪里导入 FormsModule @NgModule( imports: [ ComponentsRoutingModule, BsDropdownModule.forRoot(), ModalModule.forRoot(), TabsModule ],

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

Angular/NgForm/NgModel 指令错误:没有将“exportAs”设置为“ngForm”的指令

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

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

Angular2(ngSubmit)不工作

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

Angular2+Spring Boot:无法解决上下文路径问题 |前端没有数据