Para esse projeto Gatitobook, queria colocar visualização de senha "O olho no campo senha" Alguem pode me ensinar?
Para esse projeto Gatitobook, queria colocar visualização de senha "O olho no campo senha" Alguem pode me ensinar?
Olá Edgard, tudo bom?
Dei uma pesquisada e encontrei um jeito de mostrar e esconder a senha.
Para criar essa funcionalidade eu vou usar o LoginComponent
do projeto Gatitobook mesmo e seguindo os passos você pode repetir no NovoUsuarioComponent
. Vamos lá.
Primeiro vou criar o botão ao lado do campo de senha, usei um recurso do Input group do Bootstrap. Portanto teremos algumas alterações no campo senha. Vamos envolver o input
com uma div
de classe input-group
e adicionar um elemento irmão para o input
, uma div
com a classe input-group-append
, dentro dele vamos colocar um button
e dentro teremos um ícone da biblioteca Font Awesome.
<div class="form-group">
<div class="input-group">
<input type="password" class="form-control" placeholder="Senha" [(ngModel)]="senha" name="senha"
#campoSenha required />
<div class="input-group-append">
<button class="btn btn-outline-secondary" type="button" (click)="senhaVisivel(campoSenha)"><i class="fa fa-eye"
aria-hidden="true"></i></button>
</div>
</div>
<app-mensagem *ngIf="loginForm.controls.senha.invalid && loginForm.controls.senha.touched" mensagem="Senha obrigatória"></app-mensagem>
</div>
Temos também que mudar os atributos do input
. A variável de referência que passamos o ngModel
para o formulário vai passar a ser somente uma variável de referência. Com isso vamos ter que alterar a condicional do app-mensagem
passando loginForm.controls.senha
no lugar de campoSenha
.
Pronto. Agora vamos falar sobre o evento click
no botão. Vamos vincular esse evento com uma função que vai receber como parâmetro a variável de referência, (click)="senhaVisivel(campoSenha)
. Precisamos criar essa função dentro do componente também.
senhaVisivel(campoSenha: any){
console.log(campoSenha)
}
Isso deve aparecer no console do navegador quando clicar no olhinho:
Agora só precisamos acessar o atributo type
do input
e criar uma condição.
Caso o tipo do input
seja "password"
, o type
deve receber texto
. Senão, o type
deve receber password
.
senhaVisivel(campoSenha: any){
// PEGAR O ATRIBUTO DO ELEMENTO INPUT
const typeInput = campoSenha.getAttribute('type')
if(typeInput == "password"){
//ALTERA O ATRIBUTO DO ELEMENTO INPUT
campoSenha.setAttribute('type','text');
} else {
campoSenha.setAttribute('type','password');
}
}
E prontinho. Sobre os métodos .getAttribute e .setAttribute, vou deixar os links da documentação para entender melhor.
Bons estudos, Edgard.
Edgard,
Trocando ideia com alguns colegas encontrei outro jeito de fazer a mesma coisa, e bem mais simples.
Recomendo que use este método.
Seguindo a estrutura do input
com o botão com ícone que mostrei acima, agora vamos mexer somente no type
do input
, que agora será um Property binding, e receberá uma propriedade de dentro do componente, vou chamar essa propriedade de tipoInput
. E o evento de click
agora não recebe mais parâmetro.
<div class="input-group">
<input
[type]="tipoInput"
class="form-control"
placeholder="Senha"
[(ngModel)]="senha"
name="senha"
#campoSenha="ngModel"
required
/>
<div class="input-group-append">
<button class="btn btn-outline-secondary" type="button" (click)="senhaVisivel()"><i class="fa fa-eye"
aria-hidden="true"></i></button>
</div>
</div>
No LoginComponent
, vamos criar a propriedade e iniciar ela como "password"
. No método senhaVisivel()
vamos fazer com que tipoInput
verifique o valor, caso for "password" atribuir "text", senão for "password" deve atribuir "password", só que agora usando um if ternário.
tipoInput = 'password';
constructor( . . . ) {}
ngOnInit(): void {}
login() { . . . }
senhaVisivel(){
this.tipoInput = this.tipoInput === "password" ? "text" : "password";
}
Espero ter ajudado, Edgard. Bons estudos.