У меня есть кнопка, которая показывает/скрывает поле пароля, я дал одно и то же имя функции всем кнопкам, которые показывают/скрывают, поэтому, когда я нажимаю на конкретную кнопку показа/скрытия текстового поля, она вызывает все текстовое поле вместо текущего один.
Как сделать так, чтобы только текущее нажатое текстовое поле кнопки запускалось
HTML
TS
textTypeOld = 'text', textTypeNew = 'text', textTypeRepeat = 'text'
используйте textTypeOld = 'text', textTypeNew = 'text', textTypeRepeat = 'text'
И в HTML, отправьте строку в функцию changeText, как это
changeText("Old") // for old password
changeText("New") // for new password
changeText("Repeat") // for repeat password
и в вашем методе,
changeText(name: string) {
if(name === "Old") {
this.textTypeOld = this.textTypeOld === 'text' ? "password" : "text";
} else if (name === "New") {
this.textTypeNew = this.textTypeNew === 'text' ? "password" : "text";
}
else {
this.textTypeRepeat = this.textTypeRepeat === 'text' ? "password" : "text";
}
}
Также вам необходимо изменить атрибут type для ваших входных тегов и сопоставлений в [ngClass] соответственно.
просто попробуйте написать директиву переключения, которая переключается между классами fa-eye
и fa-eye-slash
:
директива:
import { Directive, HostListener, ElementRef, Renderer2 } from '@angular/core';
@Directive({
selector: '[appToggleIcon]'
})
export class ToggleIconDirective {
constructor(private renderer: Renderer2) { }
private flag = true
@HostListener('click', ['$event']) onClick($event: Event) {
this.flag = !this.flag;
if (this.flag) {
this.renderer.removeClass($event.target, 'fa-eye');
this.renderer.addClass($event.target, 'fa-eye-slash')
}
else {
this.renderer.removeClass($event.target, 'fa-eye-slash');
this.renderer.addClass($event.target, 'fa-eye');
}
}
}
использование:
<span>
<i class="fa fa-eye" appToggleIcon>Button3 </i>
</span>
<br>
<span>
<i class="fa fa-eye" appToggleIcon>Button2 </i>
</span>
<br>
<span>
<i class="fa fa-eye" appToggleIcon>Button1 </i>
</span>
ДЕМО: проверьте, что, нажимая на кнопки, класс меняется.
Вы можете передать $ event из вашего html в вызов функции в качестве аргумента, чтобы получить экземпляр
changeText($event)
и в вашем файле component.ts у вас будет экземпляр элемента, который вызвал ваше событие.
Ваша проблема заключается в том, что вы используете одно и то же состояние для всех полей ввода, поэтому решение так же просто, как сохранение индивидуального значения для каждого из них.
Вопрос в том, как вы можете сделать это эффективно? Мой подход был бы с простой директивой:
import{Directive,HostBinding,Input}from '@angular/core';
@Directive({
selector: "input[passwordToggler]",
exportAs: "passwordToggler"
})
export class PasswordToggler {
@Input("passwordToggler")
@HostBinding()
type: string;
get visible(){return this.type === "text"; }
toggleVisibility(){
if(this.type === "text"){
this.type === "password";
}else{
this.type === "text";
}
}
}
Как только вы объявите это в соответствующем модуле, вы можете использовать его как:
<input passwodToggler="text" #oldInputToggler="passwordToggler"/>
<i [ngClass]="oldInputToggler.visible ? 'bla-text' : 'bla-password'"
(click)="oldInputToggler.toggleVisibility()"><i/>