angular2 отправить форму, нажав клавишу ввода без кнопки отправки


100

Можно ли отправить форму, в которой нет кнопки отправки (путем нажатия Enter), пример:

<form [ngFormModel]="xxx" (ngSubmit)="xxxx()">
  <input [(ngModel)]="lxxR"   ngControl="xxxxx"/>
</form

Ответы:


77

возможно, вы добавляете keypressили keydownв поля ввода и назначаете событие функции, которая будет выполнять отправку при нажатии ввода

ваш шаблон будет выглядеть так

<form (keydown)="keyDownFunction($event)">
  <input type="text" />
</form

И вы работаете внутри своего класса, это будет выглядеть так

keyDownFunction(event) {
  if (event.keyCode === 13) {
    alert('you just pressed the enter key');
    // rest of your code
  }
}

207

Вы также можете добавить (keyup.enter)="xxxx()"


Это отлично работает, если у вас есть простая старая функция, которую вы хотите вызвать вместо обработчика отправки
Скотт Р. Фрост

3
Этот подход упоминался в документации по Angular. angular.io/docs/ts/latest/guide/…
trungk18

В моей ситуации это работает только так, спасибо!
switch87

5
Это должен быть принятый ответ. Элегантность только в том, чего может достичь Angular. Блестяще.
Скотт Байерс

Новое упоминание в документации по Angular: angular.io/guide/user-input#key-event-filtering-with-keyenter
Рафаэль Нето

84

Редактировать:

  <form (submit)="submit()" >
    <input />
    <button type="submit" style="display:none">hidden submit</button>
  </form>

Чтобы использовать этот метод, у вас должна быть кнопка отправки, даже если она не отображается "Спасибо за ответ Toolkit "

Старый ответ:

Да, именно так, как вы написали, только (submit)вместо названия события (ngSubmit):

<form [ngFormModel]="xxx" (submit)="xxxx()">
  <input [(ngModel)]="lxxR"   ngControl="xxxxx"/>
</form>


2
не могли бы вы предоставить плункер? потому что это не работает
Toolkit

Используйте видимость: скрытая; вместо. "Дисплей: нет;" работал в хроме, но не в сафари.
Moulde 04

Это следует использовать, за исключением того, что кнопка отправки не должна быть скрытой, но видимой, потому что некоторые люди будут искать эту кнопку и не будут пытаться нажимать клавишу ввода.
Impulse The Fox

31

Я предпочитаю, (keydown.enter)="mySubmit()"потому что не будет добавлен разрыв строки, если курсор находился где-то внутри, <textarea>но не на его конце.


1
Это должно быть общепринятое решение - намного чище
rhysclay

30

Это очень просто ...

<form [formGroup]="form" (keyup.enter)="yourMethod(form.value)">

</form>

2
Спасибо, легче, чем я ожидал. Решается так: <input type = "text" class = "form-control" [(ngModel)] = "object.LanguageTableData" (blur) = "mymethod ()" (keyup.enter) = "mymethod ()" / >
Loutocký 06

1
намного проще, чем отправлять функцию с помощью $ event. Спасибо!
Хелен

1
намного лучше. никаких скрытых кнопок или js. Чистый угловой путь
RenanSS

Пришлось сделать вот так: <form # f = "ngForm" (keyup.enter) = "appendSigBlock (f.value)"> с использованием Angular 9, но отлично работает.
Иордания,

10

Всегда используйте keydown.enter вместо keyup.enter, чтобы избежать задержек.

<textarea [(ngModel)]="textValue" (keydown.enter)="sendMessage();false" ></textarea>

и функция внутри component.ts

 textValue : string = '';  
 sendMessage() {
    console.log(this.textValue);
    this.textValue = '';
  }


8
(keyup.enter)="methodname()"

это должно работать и уже упоминалось во многих ответах, однако это должно присутствовать в теге формы, а не на кнопке.


7

добавление невидимой кнопки отправки делает свое дело

<input type="submit" style="display: none;">


Используйте видимость: скрытая; вместо. Вышеупомянутое работало в хроме, но не в сафари.
Moulde 04


4

Надеюсь, это может кому-то помочь: по какой-то причине я не мог отслеживать из-за нехватки времени, если у вас есть такая форма, как:

<form (ngSubmit)="doSubmit($event)">
  <button (click)="clearForm()">Clear</button>
  <button type="submit">Submit</button>
</form>

когда вы Enterнажимаете кнопку, clearFormфункция вызывается, хотя ожидаемым поведением было ее вызов doSubmit. Замена Clearкнопки на <a>тег решила проблему для меня. Я все еще хотел бы знать, ожидается это или нет. Это сбивает меня с толку


8
Чтобы этого избежать, вы должны указать type = "button" для кнопки Clear
radio_head

3

Если вы хотите включить оба варианта проще, чем то, что я видел здесь, вы можете сделать это, просто включив свою кнопку внутри формы.

Пример с функцией отправки сообщения:

                <form>
                    <mat-form-field> <!-- In my case I'm using material design -->
                        <input matInput #message maxlength="256" placeholder="Message">
                    </mat-form-field>
                    <button (click)="addMessage(message.value)">Send message
                    </button>
                </form>

Вы можете выбрать между нажатием кнопки или нажатием клавиши ввода.


Пришлось использовать это в сочетании с ответом @Clayton KN Passos, и он отлично работал!
Иордания

1

Если вы хотите включить оба - примите при вводе и примите при нажатии, затем сделайте -

 <div class="form-group">
    <input class="form-control"   type="text" 
    name="search" placeholder="Enter Search Text"
              [(ngModel)]="filterdata"  
           (keyup.enter)="searchByText(filterdata)">
  <button type="submit"  
          (click)="searchByText(filterdata)" >

  </div>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.