angular2 форму подання натисканням клавіші Enter без кнопки подання


100

Чи можна надіслати форму, яка не містить кнопки для надсилання (натисканням клавіші Enter):

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

Відповіді:


77

можливо ви додасте keypressабо keydownдо полів введення та призначите подію функції, яка буде виконувати надсилання після натискання клавіші Enter

ваш шаблон виглядав би так

<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
  }
}

206

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


Це чудово спрацьовує, якщо у вас просто звичайна стара функція, яку ви хочете зателефонувати замість обробника подачі
Scott R. Frost

3
Цей підхід згадувався в документах Angular. angular.io/docs/ts/latest/guide/…
trungk18

Це єдиний спосіб, як це працює в моїй ситуації, дякую!
switch87

5
Це має бути прийнятою відповіддю. Елегантність лише у тому, як можна досягти кутових. Блискуча.
Скотт Байєрс

Нова згадка в документації 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
чи можете ви надати плунжера? тому що це не працює
Інструментарій

Використовуйте "видимість: приховано;" замість цього. "Дисплей: немає;" працював у хромі, але не в сафарі.
Moulde

Це слід використовувати, за винятком того, що кнопка подання не повинна бути прихованою, але видимою, оскільки деякі люди шукатимуть цю кнопку і не будуть намагатися натискати клавішу Enter.
Імпульс Лисиці

31

Я вважаю за краще, (keydown.enter)="mySubmit()"тому що розрив рядка не буде додано, якщо курсор знаходився десь у межах, <textarea>але не в його кінці.


1
Це має бути прийнятим рішенням - набагато чистішим
rhysclay

27

Цей спосіб набагато простий ...

<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ý

1
набагато простіший спосіб, а не надсилання функції з $ event. Дякую!
Хелен

1
набагато краще. відсутність прихованих кнопок або js. Чистий кутовий шлях
RenanSS

10

Завжди використовуйте keydown.enter замість keyup.enter, щоб уникнути відставання.

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

і функціонує всередині компонента.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


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

2

Якщо ви хочете включити обидва простіші, ніж те, що я бачив тут, ви можете зробити це, просто включивши кнопку у форму.

Приклад функції, що надсилає повідомлення:

                <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>

Ви можете вибрати між натисканням на кнопку або натисканням клавіші Enter.


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.