Введите ключ для перехода к следующему элементу в форме Ionic 4 Angular 8 - PullRequest
0 голосов
/ 21 ноября 2019

В моем PWA, построенном на Ionic и Angular 8, мне нужно обработать нажатие клавиши ввода, чтобы перейти к следующему элементу. Как я могу добиться этого с (keyup.enter). Пожалуйста, помогите мне.

https://stackblitz.com/edit/ionic-3drfby

Ответы [ 2 ]

1 голос
/ 21 ноября 2019

Я бы написал для этого специальную директиву. Вдохновленный этим ответом . Директива может быть помещена в тэг, мы используем HostListener для прослушивания keyup.enter и, если существует следующий элемент, мы перемещаем фокус на него.

Нам нужно внести некоторые изменения в то, как вашФорма отправлена, так как ngSubmit будет вызываться при каждом нажатии Enter. Поэтому я бы удалил это из тега формы, установил кнопку на type="button" и вместо этого прикрепил к ней событие щелчка, чтобы вызвать logForm().

Так что в целом это то, что я делаю:

<form focusDir>
<!-- .... -->
<button ion-button type="button" block (click)="logForm()">Add Todo</button>

Директива:

@Directive({
  selector: "[focusDir]"
})
export class FocusDirective {
  constructor() {}

  @HostListener("keyup.enter") onKeyupEnter() {
    var nextEl = this.findNextTabStop(document.activeElement);
    nextEl.focus();
    // or try for ionic 4:
    // nextEl.setFocus();
  }

  findNextTabStop(el) {
    var universe = document.querySelectorAll(
      "input, button, select, textarea, a[href]"
    );
    var list = Array.prototype.filter.call(universe, function(item) {
      return item.tabIndex >= "0";
    });
    var index = list.indexOf(el);
    return list[index + 1] || list[0];
  }
}

Затем отметьте эту директиву в массиве declarations в вашем ngModule.

STACKBLIZ

1 голос
/ 21 ноября 2019

Один из способов - установить ссылку на следующий элемент. как показано ниже

<ion-content padding>
 <form (ngSubmit)="logForm()">
      <ion-item>
        <ion-label>Todo1</ion-label>
        <ion-input type="text" [(ngModel)]="todo.title1" name="title1" #a (keyup.enter)="setFocus(b)"></ion-input>
      </ion-item>
      <ion-item>
        <ion-label>Todo2</ion-label>
        <ion-input type="text" [(ngModel)]="todo.title2" name="title2" #b (keyup.enter)="setFocus(c)"></ion-input>
      </ion-item>
      <ion-item>
        <ion-label>Todo3</ion-label>
        <ion-input type="text" [(ngModel)]="todo.title3" name="title3" #c (keyup.enter)="setFocus(d)"></ion-input>
      </ion-item>
      <ion-item>
        <ion-label>Description</ion-label>
        <ion-textarea [(ngModel)]="todo.description" name="description" #d></ion-textarea>
      </ion-item>
      <button ion-button type="submit" block>Add Todo</button>
    </form>
</ion-content>

и в .ts файле

import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';

@Component({
  selector: 'page-home',
  templateUrl: 'home.html'
})
export class HomePage {
todo = {}
  logForm() {
    console.log(this.todo)
  }

  setFocus(nextElement) {
     nextElement.setFocus(); //For Ionic 4
    //nextElement.focus(); //older version
  }

  constructor(public navCtrl: NavController) {

  }

}
...