Невозможно программно установить фокус на поле ввода в Angular

Я пытаюсь следовать предложение и установил маркер для элемента управления вводом в моем компоненте, как это.

<span (click) = "onEditClick()"
      [class.hidden] = "editing">{{value}}</span>
<input #input
      value = "{{value}}"
      [class.hidden] = "!editing">

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

@ViewChild("input") input: ElementRef;

onEditClick() {
  this.editing = true;
  this.input.nativeElement.focus();
}

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

Я подозреваю, что мне не хватает чего-то довольно простого, что можно легко вывести из предоставленного описания.

Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
0
232
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что элемент ввода по-прежнему скрыт, когда вы пытаетесь установить на него фокус. Чтобы убедиться, что элемент ввода стал видимым после установки свойства editing, принудительно определите изменения, вызвав ChangeDetectorRef.detectChanges():

onEditClick() {
  this.editing = true;
  this.changeDetectorRef.detectChanges();
  this.input.nativeElement.focus();
}

См. этот стекблиц для демонстрации.

Это работает, так что зеленая галочка сразу. Я также хотел бы знать, есть ли лучший подход ко всей концепции, устраняющий потенциальный недостаток в моем дизайне. Причина, по которой я задаюсь вопросом, заключается в том, что кажется, что для обнаружения изменений требуется толчок (согласно вашему предложению), и обычно такие вещи «просто работают», когда остальная часть программного обеспечения настроена правильно. Или это просто один из таких случаев?

Konrad Viltersten 07.04.2019 00:30

Я не думаю, что есть лучший способ, потому что фокус нельзя установить через привязку данных. Единственная известная мне альтернатива — установить фокус асинхронно (например, с помощью setTimeout).

ConnorsFan 07.04.2019 00:34

Спасибо за последний ответ. Это и принято, и +1, как и должно быть. Интересно, есть ли у вас время взглянуть на аналогичный вопрос, но в отношении случая изменения свойства, вызванного извне компонента. Если нет, я все еще благодарен за этот ответ.

Konrad Viltersten 16.04.2019 23:27

Другие вопросы по теме