#javascript #angular #typescript
Вопрос:
Я работал с этой функцией , где есть пароль и подтверждение пароля, в каждом поле есть функция скрытия/скрытия для отображения и скрытия пароля, но проблема в том, что второй глаз или скрытие или подтверждение пароля не работает, но отлично работает с паролем
Подтверждение нового пароля не скрывается и не отображается , у кого-нибудь есть идеи о том, почему и как ?
#html-код
<mat-form-field class="full-width" appearance="fill">
<mat-label>New password</mat-label>
<input matInput formControlName="password" type="{{(showPassword === false)?'password':'text'}}" />
<mat-icon matSuffix style="cursor: pointer;" (click)="toggleShowPassword()">
{{!showPassword?'visibility':'visibility_off'}}</mat-icon>
<mat-error *ngIf="password.hasError('required')">
{{errFormMsg.REQUIRED}}
</mat-error>
</mat-form-field>
<mat-form-field class="full-width" appearance="fill">
<mat-label>Confirm new password</mat-label>
<input matInput formControlName="confirmPassword"
type="{{(showPassword === false)?'confirmPassword':'text'}}" />
<mat-icon matSuffix style="cursor: pointer;" (click)="toggleShowPassword()">
{{!showPassword?'visibility':'visibility_off'}}</mat-icon>
<mat-error *ngIf="confirmPassword.hasError('required')">
{{errFormMsg.REQUIRED}}
</mat-error>
<mat-error *ngIf="signupForm.get('confirmPassword').hasError('notEqual')">
Password does not match
</mat-error>
</mat-form-field>
#код ts
export class LoginComponent implements OnInit {
accountId: any;
email: string;
isInProgress: boolean;
signupForm: FormGroup;
hasSubmit = false;
apiErrMsg = null;
errFormMsg = ERR_FORM_MSG;
labels = LABELS;
isRemembered = false;
showPassword = false;
isLoggingIn = false;
code: string;
generalStatus = FormStatus.LOGIN;
securedEmail: string;
showVerificationSuccessMessage: boolean;
data: any;
constructor(
private fb: FormBuilder,
private userService: UserService,
private _userProfileService: UserProfileService,
private _notificationService: NotificationService,
private authService: AuthService,
private route: Router,
private router: ActivatedRoute,
public dialog: MatDialog
) {
this.signupForm = this.fb.group({
confirmPassword: [
'',
[Validators.required, this.equalWithPasswordValidator.bind(this)],
],
password: [
'',
[
this.validatePasswordRequired,
this.validateMinimumPassword,
this.validatePasswordUpperCase,
this.validatePasswordLowerCase,
this.validatePasswordSpecialCharacter,
this.validateOneNumber,
],
],
});
}
toggleShowPassword() {
this.showPassword = !this.showPassword;
console.log("this.showPassword" , this.showPassword)
}
get password() {
return this.signupForm.controls['password'];
}
get confirmPassword() {
return this.signupForm.controls['confirmPassword'];
}
Ответ №1:
Ваш вклад type
и formControlName
не нужно сопоставлять. type
определяет тип ввода и formControlName
определяет имя элемента управления формой. Ваш ввод должен быть либо типа 'password'
, либо 'text'
Вы неправильно определили тип пароля подтверждения как
type="{{(showPassword === false)?'confirmPassword':'text'}}"
Это позволит ввести тип ввода как 'confirmPassword'
. Там нет типа ввода типа 'confirmPassword'
. Это должно быть
type="{{(showPassword === false)?'password':'text'}}"
Ваш ввод пароля для подтверждения должен быть определен следующим образом
<input matInput formControlName="confirmPassword"
type="{{(showPassword === false)?'password':'text'}}" />
**Правка : ** Если вы хотите выполнять функцию переключения отдельно, вы можете использовать две переменные для переключения пароля и подтверждения пароля.
Пример Реализации
component.ts
export class LoginComponent implements OnInit {
.
.
showPassword = false;
showConfirmPassword = false;
.
.
toggleShowPassword(showBoolean) {
showBoolean = !showBoolean;
}
}
component.html
<mat-form-field class="full-width" appearance="fill">
<mat-label>New password</mat-label>
<input matInput formControlName="password" type="{{(showPassword === false)?'password':'text'}}" />
<mat-icon matSuffix style="cursor: pointer;" (click)="toggleShowPassword(showPassword)">
{{!showPassword?'visibility':'visibility_off'}}</mat-icon>
<mat-error *ngIf="password.hasError('required')">
{{errFormMsg.REQUIRED}}
</mat-error>
</mat-form-field>
<mat-form-field class="full-width" appearance="fill">
<mat-label>Confirm new password</mat-label>
<input matInput formControlName="confirmPassword" type="{{(showConfirmPassword === false)?'password':'text'}}" />
<mat-icon matSuffix style="cursor: pointer;" (click)="toggleShowPassword(showConfirmPassword)">
{{!showConfirmPassword?'visibility':'visibility_off'}}</mat-icon>
<mat-error *ngIf="confirmPassword.hasError('required')">
{{errFormMsg.REQUIRED}}
</mat-error>
<mat-error *ngIf="signupForm.get('confirmPassword').hasError('notEqual')">
Password does not match
</mat-error>
</mat-form-field>
Комментарии:
1. Что ты имеешь в виду? не могли бы вы уточнить ?
2. я хочу , чтобы в каждом поле был показан/скрыт пароль, если пользователь показывает только поле подтверждения пароля, то оно должно показывать только поле подтверждения пароля, а не оба одновременно
3. Вы используете только одну переменную класса
showPassword
для переключения типа ввода. Для этого вам нужно многое изменить.4. У вас есть более двух входов?
5. у вас есть пример, сэр, если бы я хотел иметь каждый пароль для каждого поля ?