Angular - 没有将“exportAs”设置为“ngModel”的指令

时间:2017-05-22 07:22:28

标签: angular angular2-forms angular2-ngmodel

以下是AngularJS项目中的文件。正如一些帖子中所建议的那样,我补充道:

.........
"dependencies": {
        "@angular/common": "^2.3.1",
        "@angular/compiler": "^2.3.1",
        "@angular/core": "^2.3.1",
        "@angular/forms": "^2.3.1",
        "@angular/http": "^2.3.1",
        "@angular/platform-browser": "^2.3.1",
        "@angular/platform-browser-dynamic": "^2.3.1",
        "@angular/router": "^3.3.1",
        "core-js": "^2.4.1",
        "rxjs": "^5.0.1",
        "ts-helpers": "^1.1.1",
        "zone.js": "^0.7.2"
    },
   ...............

在输入字段中,但仍然出错。

的package.json

<form #f="ngForm" [formGroup]="changePasswordForm">
        <div class="form-group">
            <label for="currentPassword">Current Password</label> <input
                placeholder="currentPassword" ngModel name="currentPassword"
                #currentPassword="ngModel" id="currentPassword"
                name="currentPassword" type="text" class="form-control" required
                minlength="6" formControlName="currentPassword">
            </div>
        </div>
        <button class="btn btn-primary" type="submit">Change Password</button>
    </form>

更改-password.component.html

import { Component, OnInit } from '@angular/core';
import { FormBuilder, Validators, ControlContainer, FormGroup, FormControl } from '@angular/forms';

@Component({
  selector: 'app-change-password',
  templateUrl: './change-password.component.html',
  styleUrls: ['./change-password.component.css']
})
export class ChangePasswordComponent implements OnInit {

  changePasswordForm;

  constructor(formBuilder: FormBuilder) {
    this.changePasswordForm = formBuilder.group({
      currentPassword: new FormControl('', Validators.compose([Validators.required]))
    });
  }

  ngOnInit() {
  }

}

更改-password.component.ts

............
imports: [
    BrowserModule,
    HttpModule,
    FormsModule,
    ReactiveFormsModule
  ]
...........

app.module.ts有导入

{{1}}

我收到以下错误:

  

未处理的承诺拒绝:模板解析错误:       “exportAs”设置为“ngModel”没有指令(“urrent密码”#currentPassword =“ngModel”id =“currentPassword”                       name =“currentPassword”type =“text”class =“form-co”):ChangePasswordComponent @ 5:4;区域:;任务:Promise.then;值:SyntaxError {__zone_symbol__error:错误:模板解析错误:       将“exportAs”设置为“ngModel”(“urrent Passwo ......”)没有指令错误:模板解析错误:       “exportAs”设置为“ngModel”没有指令(“urrent密码”#currentPassword =“ngModel”id =“currentPassword”                       name =“currentPassword”type =“text”class =“form-co”):ChangePasswordComponent @ 5:4           在SyntaxError.ZoneAwareError(http://localhost:4200/polyfills.bundle.js:6884:33)           在SyntaxError.BaseError [作为构造函数](http://localhost:4200/vendor.bundle.js:64475:16)           在新的SyntaxError(http://localhost:4200/vendor.bundle.js:5727:16

5 个答案:

答案 0 :(得分:10)

您正在使用模板驱动和模型驱动形式的奇怪组合。选择其中之一,不要混合这两者。所以这是模型驱动形式的样本:

无需在模板中设置requiredminlength,我们会在组件中处理。此外,我们不需要任何ngModelname等,因为我们使用formControlName。同时删除#f="ngForm",因为它与模板驱动的表单相关。所以你的模板应该是这样的:

<form [formGroup]="changePasswordForm">
  <label for="currentPassword">Current Password</label> 
  <input formControlName="currentPassword">
  <button type="submit">Change Password</button>
</form>

在构建表单时,我们会设置所需的所有验证器,在本例中为requiredminLength

constructor(formBuilder: FormBuilder) {
  this.changePasswordForm = formBuilder.group({
    currentPassword: new FormControl('', 
          Validators.compose([Validators.required, Validators.minLength(6)]))
  });
}

这就是它! :)

我建议您阅读有关表单的内容,此处为 the guide for template driven forms guide for reactive forms

修改

要进行表单验证,请检查 official docs 以进行表单验证。如果您有足够的字段,您可能需要调整其解决方案,将所有表单错误存储在单独的对象中。

但这是检查每个表单控件的表单错误的基本解决方案。以下是您的验证:

<small *ngIf="changePasswordForm.get('currentPassword').hasError('required')">Required!</small>
<small *ngIf="changePasswordForm.get('currentPassword').hasError('minlength')">Minimum 6 chars</small>

您可能还希望在触摸字段时显示错误消息(??)。您可以在我提供的用于验证的链接中找到所有内容:)

Updated Demo

答案 1 :(得分:5)

从'@ angular / forms'添加import {FormsModule};到你的app.module.ts和导入数组中你需要添加FormsModule。

答案很晚,但是如果有人在角度5中遇到问题,你需要这样做。

答案 2 :(得分:2)

这可能对Angular 6中的人有所帮助。

我忘了在输入控件中添加ngModel指令,但在表单中添加了#currentPassword="ngModel"。进口等全部就位。

答案 3 :(得分:1)

如果您使用角度模板驱动的表单并想使用#xname="ngModel",则还需要在同一输入中使用[(ngModel)]="mymodel"指令,当然,将de FormsModule导入到您的app.module,如上述其他答案中所述

答案 4 :(得分:0)

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { ContactFormComponent } from './contact-form/contact-form.component';

@NgModule({
  declarations: [
    AppComponent,
    ContactFormComponent
  ],
  imports: [
    FormsModule,
    BrowserModule,
    AppRoutingModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

导入 FormsModule 解决了问题