Saya sedang mengerjakan formulir login dan jika pengguna memasukkan kredensial tidak valid kami ingin menandai bidang email dan kata sandi sebagai tidak valid dan menampilkan pesan yang mengatakan login gagal. Bagaimana cara menetapkan bidang ini menjadi tidak valid dari panggilan balik yang dapat diamati?
Templat:
<form #loginForm="ngForm" (ngSubmit)="login(loginForm)" id="loginForm">
<div class="login-content" fxLayout="column" fxLayoutAlign="start stretch">
<md-input-container>
<input mdInput placeholder="Email" type="email" name="email" required [(ngModel)]="email">
</md-input-container>
<md-input-container>
<input mdInput placeholder="Password" type="password" name="password" required [(ngModel)]="password">
</md-input-container>
<p class='error' *ngIf='loginFailed'>The email address or password is invalid.</p>
<div class="extra-options" fxLayout="row" fxLayoutAlign="space-between center">
<md-checkbox class="remember-me">Remember Me</md-checkbox>
<a class="forgot-password" routerLink='/forgot-password'>Forgot Password?</a>
</div>
<button class="login-button" md-raised-button [disabled]="!loginForm.valid">SIGN IN</button>
<p class="note">Don't have an account?<br/> <a [routerLink]="['/register']">Click here to create one</a></p>
</div>
</form>
Metode login:
@ViewChild('loginForm') loginForm: HTMLFormElement;
private login(formData: any): void {
this.authService.login(formData).subscribe(res => {
alert(`Congrats, you have logged in. We don't have anywhere to send you right now though, but congrats regardless!`);
}, error => {
this.loginFailed = true; // This displays the error message, I don't really like this, but that's another issue.
this.loginForm.controls.email.invalid = true;
this.loginForm.controls.password.invalid = true;
});
}
Selain mengatur input flag yang tidak benar ke true Saya sudah mencoba mengatur email.valid
flag ke false, dan mengatur loginForm.invalid
ke true juga. Tidak satu pun dari ini menyebabkan input untuk menampilkan keadaan tidak valid mereka.
validation
angular
angular2-forms
efarley
sumber
sumber
setErros
metode. Tips: Anda harus menambahkan validator yang diperlukan pada file komponen Anda. Juga adakah alasan khusus untuk menggunakan ngModel dengan bentuk reaktif?Jawaban:
dalam komponen:
dan dalam HTML:
sumber
setErrors({'incorrect': false})
atausetErrrors({})
tidak bekerja untuk sayasetErrrors(null)
formData.form.controls['email'].markAsTouched();
seperti @ M.Farahmand yang disebutkan di bawah ini. GunakansetErrors({'incorrect': true})
hanya mengaturng-invalid
kelas css untuk input. Saya harap ini membantu seseorang.Menambah jawaban Julia Passynkova
Untuk mengatur kesalahan validasi dalam komponen:
Untuk menghapus kesalahan validasi dalam komponen:
Berhati-hatilah dengan menghapus kesalahan menggunakan
null
karena ini akan menimpa semua kesalahan. Jika Anda ingin menyimpan beberapa di sekitar Anda mungkin harus memeriksa keberadaan kesalahan lain terlebih dahulu:sumber
Saya mencoba untuk memanggil
setErrors()
di dalam handler ngModelChange dalam formulir template. Itu tidak bekerja sampai saya menunggu satu tanda centang dengansetTimeout()
:templat:
komponen:
Gotcha seperti ini membuat saya lebih suka bentuk reaktif.
sumber
Cannot find name 'NgModel'.
kesalahan untuk saluran@ViewChild('pwConfirmModel') pwConfirmModel: NgModel;
perbaikan apa pun untuk masalah inisetErrors
tetapi itu tidak berhasil sampai saya menggunakansetTimeout
Dalam versi baru materi 2 yang nama kontrolnya dimulai dengan awalan mat setErrors () tidak berfungsi, sebagai gantinya jawaban Juila dapat diubah menjadi:
sumber
Berikut ini contoh yang berfungsi:
sumber
Dalam formulir Reaktif saya, saya perlu menandai bidang sebagai tidak valid jika bidang lain diperiksa. Dalam ng versi 7 saya melakukan hal berikut:
Jadi di atas, ketika saya mencentang kotak itu mengatur dropdown seperti yang diperlukan dan menandainya sebagai kotor. Jika Anda tidak menandainya, maka tidak akan salah (salah) sampai Anda mencoba mengirim formulir atau berinteraksi dengannya.
Jika kotak centang disetel ke false (tidak dicentang) maka kami menghapus validator yang diperlukan pada dropdown dan meresetnya ke keadaan murni.
Juga - ingatlah untuk berhenti berlangganan dari perubahan bidang pemantauan!
sumber
Anda juga dapat mengubah 'type' viewChild ke NgForm seperti pada:
Dan kemudian referensi kontrol Anda dengan cara yang sama seperti yang disebutkan oleh @Julia:
Mengatur Kesalahan ke nol akan menghapus kesalahan pada UI:
sumber
Meskipun solusi yang terlambat tetapi berikut berhasil dari saya.
sumber
Untuk unit test:
sumber