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 = '';
  }
Шамсул
источник
10

добавьте это в свой тег ввода

<input type="text" (keyup.enter)="yourMethod()" />
Абдус Салам Азад
источник
Спасибо брат. Я предпочитаю этот вариант выбранному ответу.
Сантош,
8
(keyup.enter)="methodname()"

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

Сантош Кадам
источник
7

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

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

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

Просто добавьте (keyup.enter)="yourFunction()"

Саураб Агравал
источник
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>

источник