html - 模型驱动形式 : validation not working as expected in Angular 2

标签 html angular

我正在使用这样的模型驱动形式。 就像正常的验证一样,我希望在用户名和密码丢失时显示一条错误消息。

只要用户名和密码无效,提交按钮就应该被禁用。

<div class="login">
<form #f="ngForm" (ngSubmit)="dologin(f)">
    <div class="form-group">
        <label for="username">Username</label>
        <input id="username" type="text" class="form-control" name ="username" ngModel #username="ngModel">

        <div [hidden]="username.valid" class="alert alert-danger"> Username is required.</div>
    </div>
    <div class="form-group">
        <label for="password">Password</label>
        <input id="password" type="password" class="form-control" name ="password" ngModel #password="ngModel">
        <div [hidden]="password.valid" class="alert alert-danger"> Password is required.</div>
    </div>

    <button type="submit" [disabled]="username.length<0 || password.length<0" class="btn btn-primary" type="submit">Login</button>
</form>
</div>
  • 我从验证 div 中看到了非常奇怪的行为。有时 它显示“需要密码”,有时则不需要。
  • 我想禁用提交按钮,直到表单有效。我试过了

[disabled]="!f.valid"

但是当我把它打印出来时 f 总是有效的 虽然我没有在用户名和密码中输入任何数据。

组件:

constructor(private router: Router,private authenticationService : AuthenticationService,private httpService:HttpService,private formBuilder:FormBuilder) {
    this.form=formBuilder.group({
        username:['',Validators.required],
        password:['',Validators.required]
    });

}

更新

Can't bind to 'formGroup' since it isn't a known property of 'form'. (" ][formGroup]="form" (ngSubmit)="dologin(form.value)"> ][formControl]="form.controls['password']"> [ERROR ->] Username [ERROR ->]

"): LoginComponent@4:8 No provider for NgControl (" Password [ERROR ->] ; Task: Promise.then ; Value: Error: Template parse errors:(…) Error: Template parse errors: Can't bind to 'formGroup' since it isn't a known property of 'form'. ("
][formGroup]="form" (ngSubmit)="dologin(form.value)"> ][formControl]="form.controls['password']"> [ERROR ->] Username [ERROR ->]

谢谢。

最佳答案

您设置 HTML 模板的方式缺少一些关键位,这些位实际上确保您已将前端连接到后端以获得响应式(Reactive)表单。您所拥有的似乎更符合混合了模型驱动的模板驱动形式。事实上,如果您删除 FormsModule 导入,您发布的模板甚至不会编译。

首先删除您的 FormsModule 导入,它允许您将两种不同的表单类型混合在一起。这将使我们走上一条需要严格的 Reactive Forms(又名模型驱动)实现的道路。

<form #f="ngForm" (ngSubmit)="dologin(f)">将更改为 <form [formGroup]="form" (ngSubmit="dologin(form.value)"

您的每个输入和警告 div 将从

<input id="username" type="text" class="form-control" name="username" ngModel #username="ngModel">

<div [hidden]="username.valid" class="alert alert-danger"> Username is required.</div>

<input id="username" type="text" class="form-control" name="username" formControlName="username">

更改是因为模型驱动表单不支持 ngModel 属性和#[name]="ngModel",因此您将使用 formControlName 或 [formControl] 语法。

        <div [hidden]="form.controls['username'].valid || form.controls['username'].pristine"
        class="alert alert-danger"> Username is required.</div>

最后,您的提交按钮发生变化,请注意您有两次 type="submit",来自 <button type="submit" [disabled]="username.length<0 || password.length<0" class="btn btn-primary" type="submit">Login</button>

<button type="submit" [disabled]="!form.valid" class="btn btn-primary">Login</button>

因为我们已经成功连接了表单的其余部分,所以表单组的验证现在是正确的

这是一个你可以玩的工作插件:https://plnkr.co/edit/Mu9vEYGB35SwUr9TEsPI?p=preview

关于html - 模型驱动形式 : validation not working as expected in Angular 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40404255/

相关文章:

html - 在中型设备中设置内容 - bootstrap

angular - Angular和RxJS : How to manage errors from services to component

javascript - 仅当 Angular2/ionic2 中的 Promise 得到解析时才执行 Observble

angular - 如何在 Angular2 的 formGroup.value 中将值作为整数获取

Angular 6 数据绑定(bind)问题

javascript - 带有youtube视频的视频库-无法嵌入

html - 如何为div标签添加CSS

javascript - Jquery - [对象 HTMLCollection] 到字符串

javascript - 无法在 'setSelectionRange' : The input element's type 'HTMLInputElement' ) does not support selection 上执行 ('number'

angular - 如何在自定义元素上实现 ngModel?