Próbuję sprawdzić, czy pole e-mail i pole potwierdzenia adresu e-mail pasują do siebie. Oznacza to, że użytkownik wpisuje swój adres e-mail, a następnie musi go potwierdzić ponownie. Chcę, aby mecz/sprawdzanie poprawności odbywało się przy rozmyciu (gdy użytkownik naciśnie klawisz enter lub pole tekstowe straci ostrość).Sprawdź, czy e-maile pasują do rozmycia
Oto mój plik ts:
import {Component, OnInit} from '@angular/core';
import {User} from './user.interface';
import {FormBuilder, FormGroup, ValidatorFn} from '@angular/forms';
@Component({
selector: 'my-email',
templateUrl: '/app/components/profile/email.component.html',
styleUrls:['styles.css'],
})
export class EmailComponent implements OnInit {
public user : User;
Form : FormGroup;
ngOnInit() {
// initialize model here
this.user = {
Email: '',
confirmEmail: ''
}
if(this.Form.valid) {
this.displayErrors = false;
}
}
constructor(fb: FormBuilder, private cookieService: CookieService, private router: Router) {
this.Form = fb.group({
email: [''],
confirmEmail: ['']
},
{
validator: this.matchingEmailsValidator('email', 'confirmEmail')
});
}
save(model: User, isValid: boolean) {
// call API to save customer
//save email
}
matchingEmailsValidator(emailKey: string, confirmEmailKey: string): ValidatorFn {
return (group: FormGroup): {[key: string]: any} => {
let email = group.controls[emailKey];
let confirmEmail = group.controls[confirmEmailKey];
if (email.value !== confirmEmail.value) {
return {
mismatch: true
};
}
};
}
}
Oto mój widok:
<form [formGroup]="Form" novalidate (ngSubmit)="Form.valid && save(Form.value, Form.valid)">
<div class="container-fluid">
<div id = "container" class="contain" style="text-align: center">
<div>
<fieldset class="form-group">
<label id = "rounded" class="item item-input .col-md-6 .col-md-offset-3">
<input class="email-address-entry form-control" name="email" type="email" placeholder="[email protected]" formControlName="email" pattern="^(\\w|[0-9.!#$%&’*+/=?^_\`{|}~-])[email protected](\\w|[0-9-])+(?:[.](\\w|[0-9-])+)*$"/>
</label>
<p class="Reenter-your-email">Reenter your email to confirm</p>
<label id = "rounded" class="item item-input">
<input class="email-address-entry form-control" (blur)="displayErrors=true" name="confirmEmail" type="email" placeholder="[email protected]" formControlName="confirmEmail" validateEqual="email"/>
</label>
</fieldset>
</div>
<div>
<label class="entry-invalid">
<p *ngIf="displayErrors && !Form.get('email').valid">The email you entered does not match.</p>
</label>
</div>
<div (click)="Form.get('email').length > 0 ? save(Form.value, Form.valid) : NaN" class="{{ Form.get('email').length > 0 ? 'container-fluid anchorBottomHighlight' : 'container-fluid anchorBottom'}}">
<label class="footerLabel">Confirm</label>
</div>
</div>
</div>
</form>
Obecnie przy okazji to skonfigurować, walidacja występuje, ale nie zostanie skasowany, gdy jest poprawny mecz wkład. Zastanawiam się, jak mogę poprawnie ustawić mój widok? Tak więc komunikat sprawdzania poprawności jest pokazywany/ukrywany, gdy poprawne dopasowanie jest ustawione, a nie.
Wygląda na to, że Form.get('email').length > 0
nigdy nie jest większy niż 0/nigdy nie trafiony, więc moja etykieta nie przełącza się na kliknięcie.
Używam formularzy Angular 2 i reaktywnych.
można przejść nad bardziej szczegółowo o tym, jak korzystać z tego: this.Form.get ('e-mail') błędy.? Dziękuję bardzo za "mini samouczek". Super pomocny! – Euridice01
E.g. gdybym chciał zrobić coś takiego w moim pliku ts: if (Form.valid) { this.displayErrors = false; } – Euridice01
Poprawiłem mój przykład, aby odpowiedzieć na Twój komentarz. Czy mógłbyś zaznaczyć tę odpowiedź jako zaakceptowaną odpowiedź, jeśli uważasz, że to wystarczy? – AngularChef