当前位置: 首页 > 知识库问答 >
问题:

升级到RC6中的@angular/forms

卓宏达
2023-03-14

我一直在推迟从已弃用的表单api升级到@angle/form中的新表单api。我刚刚升级到RC6,现在也想开始使用@angle/form。

文档在这一点上非常稀缺,我很快就被卡住了。

这是我的工作形式:

<form [ngFormModel]="registrationForm" (ngSubmit)="register(registrationForm.value)">
    <fieldset class="form-group">
        <label for="email">Email address</label>
        <input type="email" class="form-control" id="email" placeholder="email" [ngFormControl]="registrationForm.controls['email']" maxlength="128" required>
    </fieldset>
    <div class="alert alert-warning" role="alert" *ngIf="registrationResponse && registrationResponse.EmailExists">
      This email account is already linked to an account! <a [routerLink]="['/user/logon']">Go here to login</a>.
    </div>
    <fieldset class="form-group">
        <label for="username">User name</label>
        <input type="text" class="form-control" id="username" placeholder="user name" [ngFormControl]="registrationForm.controls['username']" maxlength="32" required>
    </fieldset>
    <div class="alert alert-warning" role="alert" *ngIf="registrationResponse && registrationResponse.UsernameExists">
      This username is already taken! Please choose another one.
    </div>
    <div>
        <button type="submit" class="btn btn-primary" [disabled]="!registrationForm.valid">register</button>
    </div>
</form>

在与此模板关联的组件上,FORM_DIRECTIVES是在组件的“DIRECTIVES”属性中指定的,这就是提供ngFormControl指令等的原因...

如果我理解正确的话,Control和ControlGroup被重命名为FormControl和FormGroup,并且指令名也被重命名(ngFormControl等)。所以我更新了我的表格。我将ngFormModel替换为formGroup,并替换为:

[ngFormControl]="registrationForm.controls['email']"    

by

formControlName="email"

生成此表单

<form [formGroup]="registrationForm" (ngSubmit)="register(registrationForm.value)">
    <fieldset class="form-group">
        <label for="email">Email address</label>
        <input type="email" class="form-control" id="email" placeholder="email" formControlName="email" maxlength="128" required>
    </fieldset>
    <div class="alert alert-warning" role="alert" *ngIf="registrationResponse && registrationResponse.EmailExists">
      This email account is already linked to an account! <a [routerLink]="['/user/logon']">Go here to login</a>.
    </div>
    <fieldset class="form-group">
        <label for="username">User name</label>
        <input type="text" class="form-control" id="username" placeholder="user name" formControlName="username" maxlength="32" required>
    </fieldset>
    <div class="alert alert-warning" role="alert" *ngIf="registrationResponse && registrationResponse.UsernameExists">
      This username is already taken! Please choose another one.
    </div>
    <div>
        <button type="submit" class="btn btn-primary" [disabled]="!registrationForm.valid">register</button>
    </div>
</form>

但这给了我这个错误:

无法绑定到“formGroup ”,因为它不是“form”的已知属性。

我看了角度代码,在一些评论中找到了一个提到导入REACTIVE_FORM_DIRECTIVES的示例。但是我无法导入它(它在RC6中被重命名或删除了吗?),我希望我已经有了这个,因为我的应用程序模块导入了FormsModule(这不是引入整个模块的原因吗?):

@NgModule({
    imports:      [BrowserModule, FormsModule, HttpModule, appRouterRoot],
    providers:    [ApiService, LocalStorageService, AuthenticationService, UserService, ForumService],
    declarations: [
        RootComponent,
        RegistrationComponent,
        [omitted some components for brevity ....]
    ],
    bootstrap:    [RootComponent],
})
export class AppModule {}

有人知道如何进行吗?

编辑:所以,问题已经回答了。但是对于任何进行同样升级的人来说:

  • 确保导入FormsModule和ReactiveFormsModule
  • 将[ngFormModel]替换为[formGroup]
  • 在元素上添加formGroupName以反映控制
  • 用formControlName替换[ngFormControl]

窗体控件名的值只是控件的名称,您不再需要指定组名,因为这将由 formGroupName 属性处理。

共有3个答案

韩玉石
2023-03-14

您可以在此处找到一系列具有新forms API的表单示例:https://github.com/Farata/angular2typescript/tree/master/chapter7/form-samples

邢财
2023-03-14

也请在代码中导入反应式表单模块。正如你所说,问题就在于:RC6中不推荐使用REACTIVE_FORM_DIRECTIVES。

安承教
2023-03-14

在RC6中,< code > REACTIVE _ FORM _ DIRECTIVES 已被弃用并被删除。您需要导入< code>FormsModule和< code>ReactiveFormsModule:

@NgModule({
  import: [
    ...,
    FormsModule,
    ReactiveFormsModule
  ]
})
 类似资料:
  • 我们的开发团队最近将Angular 5项目更新为Angular 7。我已经下载了repo并且我正在尝试构建源代码,但是当我运行ng build命令时,我得到一个错误,没有找到'appmodule'的NgModule元数据。 如果运行ng--version命令,它将显示以下内容: 角度CLI:7.3.6 节点:11.10.0 操作系统:win32 x64 角度:7.2.10 app.module.t

  • 所有控制器都应该是形式,理想情况下应该只存在指令上 使用指令,特别是“组件指令”,使用以下属性: restrict: 'E' scope: {} template or templateUrl transclude (optional) (optional) 理想情况下每个文件有一个组件,或只做一件事

  • 我从19.10升级到Ubuntu 20.04,现在我不能使用pip。 Python已安装: 但如果我试着检查pip,我会得到: 我迷路了。谢谢你的帮助 使现代化 我使用venv创建虚拟环境。当没有激活venv时,我可以使用pip3: 但是如果我激活一个venv,它就不起作用了: 感谢您的建议和持续的帮助。 使现代化 我尝试删除venv并创建一个新的venv,但似乎我需要pip工作才能做到这一点:

  • FIS 以下统称为 FIS2 简介 FIS3相对FIS2来说接口改动较大,并不是不考虑版本上的兼容,而是不愿意做简单的小修小补,希望从整体的角度打造一个易用性和可扩展性达到一个全新高度的工具。FIS2 与FIS3将并行维护,并且绝大部分插件是兼容的。 功能升级点简介 RoadMap目录定制更简单 FIS2中roadmap是最先匹配生效的,如果想覆盖解决方案的默认配置比较麻烦。FIS3中使用了类似c

  • Refer users to this document when upgrading to Babel 7. Because not every breaking change will affect every project, we've sorted the sections by the likelihood of a change breaking tests when upgradi