这种情况
我试图在我的Angular应用程序中创建一个非常简单的表单,但无论如何,它都无法工作。
Angular版本
Angular 2.0.0 RC5
这个错误
不能绑定到'formGroup'因为它不是'form'的已知属性
的代码
视图
<form [formGroup]="newTaskForm" (submit)="createNewTask()">
<div class="form-group">
<label for="name">Name</label>
<input type="text" name="name" required>
</div>
<button type="submit" class="btn btn-default">Submit</button>
</form>
控制器
import { Component } from '@angular/core';
import { FormGroup, FormControl, Validators, FormBuilder } from '@angular/forms';
import {FormsModule,ReactiveFormsModule} from '@angular/forms';
import { Task } from './task';
@Component({
selector: 'task-add',
templateUrl: 'app/task-add.component.html'
})
export class TaskAddComponent {
newTaskForm: FormGroup;
constructor(fb: FormBuilder)
{
this.newTaskForm = fb.group({
name: ["", Validators.required]
});
}
createNewTask()
{
console.log(this.newTaskForm.value)
}
}
《ngModule
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { routing } from './app.routing';
import { AppComponent } from './app.component';
import { TaskService } from './task.service'
@NgModule({
imports: [
BrowserModule,
routing,
FormsModule
],
declarations: [ AppComponent ],
providers: [
TaskService
],
bootstrap: [ AppComponent ]
})
export class AppModule { }
这个问题
为什么会出现这个错误?我遗漏了什么吗?
RC6/RC7/最终版本FIX
要修复这个错误,你只需要从模块中的@angular/forms导入ReactiveFormsModule。下面是一个导入ReactiveFormsModule的基本模块的例子:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
@NgModule({
imports: [
BrowserModule,
FormsModule,
ReactiveFormsModule
],
declarations: [
AppComponent
],
bootstrap: [AppComponent]
})
export class AppModule { }
为了进一步解释,formGroup是一个名为FormGroupDirective的指令的选择器,它是ReactiveFormsModule的一部分,因此需要导入它。它用于将现有的FormGroup绑定到DOM元素。你可以在Angular的官方文档页面上阅读更多信息。
RC5修复
你需要从控制器中的@angular/forms中导入{REACTIVE_FORM_DIRECTIVES},并将其添加到@Component中的指令中。这样问题就解决了。
在你修复了这个问题之后,你可能会得到另一个错误,因为你没有在表单中添加formControlName="name"到你的输入中。
如果你必须导入两个模块,然后像下面这样添加
import {ReactiveFormsModule,FormsModule} from '@angular/forms';
@NgModule({
declarations: [
AppComponent,
HomeComponentComponent,
BlogComponentComponent,
ContactComponentComponent,
HeaderComponentComponent,
FooterComponentComponent,
RegisterComponent,
LoginComponent
],
imports: [
BrowserModule,
FormsModule,
HttpModule,
routes,
ReactiveFormsModule
],
providers: [],
bootstrap: [AppComponent]
})
好的,经过一些挖掘,我找到了一个解决方案“不能绑定到‘formGroup’,因为它不是一个已知的‘形式’属性。”
对于我的情况,我一直在使用多个模块文件,我在app.module.ts中添加了ReactiveFormsModule
import { FormsModule, ReactiveFormsModule } from '@angular/forms';`
@NgModule({
declarations: [
AppComponent,
]
imports: [
FormsModule,
ReactiveFormsModule,
AuthorModule,
],
...
但是当我从添加到另一个模块的组件中使用[formGroup]指令时,这就不起作用了,例如在author.module.ts文件中订阅的author.component.ts中使用[formGroup]:
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { AuthorComponent } from './author.component';
@NgModule({
imports: [
CommonModule,
],
declarations: [
AuthorComponent,
],
providers: [...]
})
export class AuthorModule {}
我想如果我在app.module中添加ReactiveFormsModule。默认情况下,ReactiveFormsModule将被它的所有子模块继承,比如author。模块在这种情况下…(错误的)。
我需要在author.module.ts中导入ReactiveFormsModule,以使所有指令都能工作:
...
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
...
@NgModule({
imports: [
...,
FormsModule, //added here too
ReactiveFormsModule //added here too
],
declarations: [...],
providers: [...]
})
export class AuthorModule {}
因此,如果您正在使用子模块,请确保在每个子模块文件中导入ReactiveFormsModule。
注意:小心加载器和最小化(Rails env.):
在看到这个错误并尝试了每个解决方案之后,我意识到我的html加载器有问题。
我已经设置了我的Rails环境,为我的组件成功导入HTML路径与这个加载器(config/loaders/ HTML .js.):
module.exports = {
test: /\.html$/,
use: [ {
loader: 'html-loader?exportAsEs6Default',
options: {
minimize: true
}
}]
}
经过几个小时的努力和无数的ReactiveFormsModule导入,我看到我的formGroup是小字母:formGroup。
这让我看到了加载器,它在最小化上减少了我的HTML。
在改变了选项之后,一切都正常了,我又可以回去哭了。
我知道这不是问题的答案,但对于未来的Rails访问者(和其他使用自定义加载器的人),我认为这可能会有帮助。
在app.module.ts中导入并注册ReactiveFormsModule。
import { ReactiveFormsModule } from '@angular/forms';
@NgModule({
declarations: [
AppComponent,
HighlightDirective,
TestPipeComponent,
ExpoentialStrengthPipe
],
imports: [
BrowserModule,
ReactiveFormsModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
请确保.ts和.html文件中的拼写正确。
xxx.ts
profileForm = new FormGroup({
firstName: new FormControl(''),
lastName: new FormControl('')
});
xxx.html文件-
<form [formGroup]="profileForm">
<label>
First Name:
<input type="text" formControlName = "firstName">
</label>
<label>
Last Name:
<input type="text" formControlName = "lastName">
</label>
</form>
我错误地写了[FormGroup]而不是[FormGroup]。在.html中检查拼写是否正确。如果.html文件中有任何错误,它不会抛出编译时错误。
如果你在开发一个组件时遇到了这个问题,你应该把这两个模块添加到你最近的模块中:
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
@NgModule({
declarations: [
AppComponent
],
imports: [
// other modules
FormsModule,
ReactiveFormsModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
如果你正在为你的组件开发一个测试,那么你应该像这样将这个模块添加到你的测试文件中:
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ContactusComponent } from './contactus.component';
import { ReactiveFormsModule } from '@angular/forms';
describe('ContactusComponent', () => {
let component: ContactusComponent;
let fixture: ComponentFixture<ContactusComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ContactusComponent],
imports:[
ReactiveFormsModule
]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ContactusComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
该错误表示在此模块中无法识别FormGroup。因此,您必须在每个使用FormGroup的模块中导入这些(下面)模块
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
然后将FormsModule和ReactiveFormsModule添加到模块的imports数组中。
imports: [
FormsModule,
ReactiveFormsModule
],
你可能会想,我已经在AppModule中添加了它,它应该从它继承?但事实并非如此。因为这些模块导出的是必需的指令,而这些指令只能在导入模块中使用。在共享模块中阅读更多。
导致这些错误的其他因素可能是拼写错误,如下所示…
[FormGroup]="form"大写F而不是小写F
[formsGroup]="form" form后面多出的s
我也有同样的问题。确保如果使用子模块(例如,你不仅有app.component.module.ts),而且有一个单独的组件,如login.module。在这个login.module.ts导入中包含ReactiveFormsModule导入,这样它才能工作。我甚至不需要在我的app.component.module中导入ReactiveFormsModule,因为我使用了所有的子模块。
文件login.module.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { IonicModule } from '@ionic/angular';
import { LoginPageRoutingModule } from './login-routing.module';
import { LoginPage } from './login.page';
@NgModule({
imports: [
CommonModule,
FormsModule,
ReactiveFormsModule,
IonicModule,
LoginPageRoutingModule
],
declarations: [LoginPage]
})
export class LoginPageModule {}
简单的解决方案:
步骤1:导入ReactiveFormModule
import {ReactiveFormsModule} from '@angular/forms';
步骤2:将“ReactiveFormsModule”添加到导入部分
imports: [
ReactiveFormsModule
]
步骤3:重新启动应用程序并完成
例子:
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import {ReactiveFormsModule} from '@angular/forms';
import { EscalationManagementRoutingModule } from './escalation-management-routing.module';
import { EscalationManagementRouteWrapperComponent } from './escalation-management-route-wrapper.component';
@NgModule({
declarations: [EscalationManagementRouteWrapperComponent],
imports: [
CommonModule,
EscalationManagementRoutingModule,
ReactiveFormsModule
]
})
export class EscalationManagementModule { }
你的Angular版本是11+,你使用的是VisualStudioCode?
你已经导入了FormsModule, ReactiveFormsModule,并将其添加到app.module.ts的import -section中(相关模块可能不同,请选择正确的模块):
// app.module.ts (excerpt)
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
imports: [
...
FormsModule,
ReactiveFormsModule,
...
],
您有正确的导入(有时还有其他具有类似名称的库);您已经在组件中定义并初始化了表单吗?
// MyWonderfulComponent (excerpt)
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
export class MyWonderfulComponent implements OnInit {
form: FormGroup;
...
constructor (private fb: FormBuilder) {
this.form = this.fb.group({
// DON'T FORGET THE FORM INITIALISATION
});
}
你的组件模板有你的表单:
<form [formGroup]="form" (ngSubmit)="submit()">
<!-- MY FORM CONTROLS ARE ALREADY HERE -->
</form>
您仍然会收到错误消息“…因为它不是已知的……”?
然后只需简单地重新启动VisualStudioCode:)
我没有看到这里描述的这种特定的失败机制,也没有看到任何关于public-api的引用。在这个问题的其他地方,所以添加它,以防它帮助其他人。
我在一个特性模块中使用响应式表单构建了一个组件。按照其他回答中描述的指导,我的模块构建没有问题,直到我试图通过public-api.ts导出组件。在这一点上,我开始得到熟悉的错误不能绑定到'formGroup',因为它不是'形式'的已知属性,没有其他迹象可能是错误的。
这个问题发生在我身上,因为我忘记从NgModule中声明和导出这个组件。一旦我把它添加到那里,模块就开始重新构建。因此,在NgModule中尝试导出响应式表单组件时,要记住三件事:
import { NgModule } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms';
import { MyExportedComponent } from './components/my-exported.component';
@NgModule({
declarations: [
MyExportedComponent // this
],
imports: [
ReactiveFormsModule // this
],
exports: [
MyExportedComponent // and this
],
providers: [
]
})
export class MyModule { }
此时,Angular会在public-api.ts中使用这行代码:
export * from './lib/my-module/components/my-exported.component';
对于Angular 14和使用带有路由的子模块的人
我的问题与使用带有路由的子模块有关。
要做到这一点,请遵循以下三个步骤:
1-在app.module中
imports: [
//other-modules
ReactiveFormsModule
]
2-在子模块中
imports: [
//other-modules
ReactiveFormsModule
]
3-在应用路由中。模块添加以下路由(我的模块名为AuthModule)
{
path: 'signup',
component: SignUpComponent,
children: [
{
path: '',
loadChildren: () =>
import('./features/auth/auth.module').then((m) => m.AuthModule),
},
]
},
希望有一天这能帮助到别人!