Управление порядком вкладок с помощью nativeElement.focus() из углового компонента

#html #angular #ignite-ui-angular

#HTML #angular #ignite-пользовательский интерфейс-angular

Вопрос:

Мне нужно выполнить цикл с расширенным элементом управления наложением. Как только наложение расширено, я хочу циклически просматривать входные элементы, пока наложение не будет свернуто. У меня есть код, работающий до определенной точки, то есть, как только наложение становится видимым, мой фокус устанавливается на первый элемент ввода и циклически переходит к последнему элементу «кнопка».

Моя проблема в том, что код, который я добавил, чтобы я мог циклически обходить расширенное наложение, работает не так, как ожидалось.

Этот фрагмент кода изначально устанавливает фокус на первый элемент ввода

 @ViewChild('focusShortCode', { static: true }) nameField: ElementRef;
public setFocus(isSet: boolean) {
        if (isSet) {
          this.nameField.nativeElement.focus();
        }
      }
  

Предполагается, что этот фрагмент кода снова вернет фокус на первый элемент ввода

  public onBlur(isSet: boolean) {
    if (isSet) {
      this.nameField.nativeElement.focus();
    }
  }
  

Проблема в том, что при вызове ‘onBlur’ мой фокус переходит на второй элемент ввода в моем расширенном наложении

onblur устанавливает фокус на элемент ‘name’, а не на элемент ‘shortCode’

 <div class="container">
<div class="layout-box" igxLayout igxLayoutJustify="end">
  <div class="layout-box__el" >
    <igx-input-group type="border" style="width: 200px;">
      <input igxInput #focusShortCode name="shortCode" type="text" [value]="shortCode" />
      <label igxLabel  for="shortCode">{{shortCodePlaceHolder}}</label>
    </igx-input-group>
  </div>
  <div class="layout-box__el">
    <igx-input-group type="border" style="width: 200px;">
      <input igxInput name="name" type="text" [value]="name" />
      <label igxLabel for="name">{{namePlaceHolder}}</label>
    </igx-input-group>
  </div>
</div>
<div class="layout-box" igxLayout igxLayoutJustify="end" style="margin-top: -15px;">
  <div class="layout-box__el">
    <igx-input-group type="border" style="width: 200px;">
      <input igxInput name="street1" type="text" [value]="street1" />
      <label igxLabel for="street1">{{street1PlaceHolder}}</label>
    </igx-input-group>
  </div>
  <div class="layout-box__el">
    <igx-input-group type="border" style="width: 200px;">
    <input igxInput name="street2" type="text" [value]="street2"/>
      <label igxLabel for="street2">{{street2PlaceHolder}}</label>
    </igx-input-group>
  </div>
</div>

<div class="layout-box" igxLayout igxLayoutJustify="end" style="margin-top: -15px;">
  <div class="layout-box__el">
    <igx-input-group type="border" style="width: 200px;">
      <input igxInput name="city" type="text" [value]="city"/>
      <label igxLabel for="city">{{cityPlaceHolder}}</label>
    </igx-input-group>
  </div>
  <div class="layout-box__el">
    <igx-input-group type="border" style="width: 200px;">
      <input igxInput name="country" type="text" [value]="county"/>
      <label igxLabel for="country">{{countyPlaceHolder}}</label>
    </igx-input-group>
  </div>
</div>

<div class="layout-box" igxLayout igxLayoutJustify="end" style="margin-top: -15px;">
  <div class="layout-box__el">
    <igx-input-group type="border" style="width: 200px;">
      <input igxInput name="postCode" type="text" [value]="postCode"/>
      <label igxLabel for="postCode">{{postCodePlaceHolder}}</label>
    </igx-input-group>
  </div>
  <div class="layout-box__el">
    <igx-input-group type="border" style="float: right; width: 100px;" >
      <input igxInput name="country" type="text" [value]="country" />
      <label igxLabel for="country">{{countryCodePlaceHolder}}</label>
    </igx-input-group>
  </div>
  <div>
    <button class="igx-button--raised" #buttonElement igxButton (keydown.Tab)="onBlur(true)">Close</button>
  </div>

</div>
</div>
  

Ответ №1:

При перезаписи логики, применяемой при нажатии клавиши, щелчке кнопки и т.д. необходимо убедиться, что поведение по умолчанию предотвращено. Поскольку нажатие клавиши является отменяемым событием, вы можете передать аргумент события обработчику и отменить его с помощью event.preventDefault(). До этого мог быть вызван метод event.stopPropagation(), чтобы предотвратить переполнение события:

 document.getElementById("buttonElement")
        .addEventListener("keydown", (event) => {
            if (event.key === "Tab") {
                //focus the first element
                this.firstElem.focus();
                //stop the default behaviour
                event.stopPropagation();
                event.preventDefault();
            }
        });
  

Небольшой пример, иллюстрирующий мое предложение с использованием igxInputGroup и IgxOverlayService, доступен здесь:https://stackblitz.com/edit/cycle-through-elems-in-overlay