javascript - Prevenindo o envio do formulário ao pressionar a tecla Enter no Angular
Existem tantas respostas para isso no Stack Overflow. Mas, infelizmente, nenhuma delas está funcionando para mim. Vou te contar o que eu tentei uma por uma.
<form (keydown.enter)="$event.preventDefault()" ...><button (keyup.enter)="skillsHandleEnter($event, skillString)"></button>@Component(...) class MyComponent { skillsHandleEnter(evento, skillString) { evento.preventDefault(); /... sua lógica } }
Mas nenhuma das abordagens está funcionando. Estou usando ngx-tags-input que me permite aplicar algumas tags separadas pela tecla enter. Isso cria um problema. No momento em que pressiono a tecla Enter, meu formulário é enviado com apenas uma tag que consegui inserir. Acredite, eu tentei quase tudo para impedir isso e também não quero complicar demais as coisas. Por favor, ignore as convenções de nomenclatura. Eu as corrigirei mais tarde.
Aqui está meu blog.component.html antes de implementar qualquer solução.
<form [formGroup]="editorForm" (ngSubmit)="onSubmit()">
<div class="form-group">
<label for="exampleInputEmail1">
<h3>Title</h3>
</label>
<input type="text" class="form-control" id="inputTitle" aria-describedby="emailHelp" placeholder="Enter a question that explains your problem exactly">
<br>
<label for="editor">
<h3>Editor</h3>
</label>
<quill-editor [styles]="editorStyle" [modules]="config" formControlName="editor"></quill-editor>
</div>
<ngx-tags-input class="form-control input-lg" name="tags"></ngx-tags-input>
<button class="btn btn-primary mt-3 mb-3">Submit</button>
</form>
Por favor, corrija-me.
Resposta #1
Eu segui estes dois passos simples:
1) Eu adicionei um atributo na minha tag form.
(keydown.enter)="$event.preventDefault()"2) Adicionado ouvinte (click) no botão de envio
Então, todo o código HTML fica assim:
<div class="container">
<div class="row pt-5">
<div class="col-md-12 col-lg-12 col-sm-12 bg-light">
<form [formGroup]="editorForm" (keydown.enter)="$event.preventDefault()">
<div class="form-group">
...
</div>
<button class="btn btn-primary (click)="onSubmit()">Submit</button>
</form>
</div>
</div>
</div>
O problema era que eu estava usando o listener de clique com a própria tag form junto com keydown.enter.
Resposta #2
o elemento de botão HTML possui três tipos válidos
- enviar : o botão envia os dados do formulário para o servidor. Este é o padrão 🔥🔥 se o atributo não for especificado, ou se o atributo for alterado dinamicamente para um valor vazio ou inválido.
- resetar: O botão redefine todos os controles para seus valores iniciais, como . botão: O botão não possui comportamento padrão e não faz nada quando pressionado. Ele pode ter scripts do lado do cliente associados aos eventos do elemento, que são acionados quando os eventos ocorrem.
- botão: o botão não tem comportamento padrão e não faz nada quando pressionado. Ele pode ter scripts do lado do cliente associados aos eventos do elemento, que são acionados quando os eventos ocorrem.
então, para resolver o problema, basta definir o tipo do botão como button assim
<button type="button" (click)="onSubmit()" class="btn btn-primary mt-3 mb-3">Submit</button>
