Как настроить автофокус в mat-select?

В моем угловом проекте есть угловой материал и используется мат-выбор. Mat-select - это первый элемент для моей формы, в моем случае установлен автофокус, когда страница была успешно загружена, но я не смог установить автофокус на mat-select. Кто-нибудь может помочь мне найти способ установить автофокус в mat-select.

@ViewChild("name") nameField: ElementRef;

ngOninit() {
  this.nameField.nativeElement.focus();
} 

HTML

<div>
 <mat-select [(ngModel)] = "nameField" #name>
    <mat-option *ngFor = "let option of options2" [value] = "option.id">
      {{ option.name }}
    </mat-option>
 </mat-select>
</div>
[focused] = "true"?
quirimmo 08.02.2019 15:01

Вы должны использовать директиву для этой цели. Проверьте этот ответ: stackoverflow.com/a/44729559/7630248

Chris Tapay 08.02.2019 15:03

Возможный дубликат Angular 2 Фокус ввода материала не работает

Chris Tapay 08.02.2019 15:05

Пожалуйста, включите код, который вы пробовали, здесь, в Stack Overflow.

Heretic Monkey 08.02.2019 15:13

Я до сих пор не могу понять, почему вы взяли мой ответ и вставили в вопрос

Gaspar 08.02.2019 19:34

вы просто хотите сфокусировать выбор или сфокусировать и открыть при загрузке?

Harshad Vekariya 17.10.2019 08:04
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
11
6
15 754
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Вы можете адаптировать этот пример к своему проекту. Щелчок по кнопке становится фокусом.

фокусируясь на элементах формы способом Angular

показать больше

Предоставление ссылки на ответ не является хорошим способом ответить на вопрос. Пожалуйста, включите соответствующий код, если позволяет лицензия сайта, здесь, на Stack Overflow. Вероятно, вы можете использовать Фрагменты стека для предоставления исполняемого фрагмента.
Heretic Monkey 08.02.2019 15:16

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

BlueCloud 08.02.2019 15:25

Вы можете вызвать в фокус на OnInit

тс:

 options2 = ['A', 'B'];

  @ViewChild('name')
  nameField: MdSelect;

  ngOnInit() {
    setTimeout(() => {
      this.nameField.open();
    }, 0);
  }

HTML:

<div>
<md-select [(ngModel)] = "nameField" #name>
    <md-option *ngFor = "let option of options2" [value] = "option.id">{{ option }}</md-option>
</md-select>

Обновлено: Извините, я думаю, вы не можете получить родной элемент от mat-select и md-select. Вам нужно получить объект и вызвать open(). Рабочий проект здесь, в стекблиц

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

BlueCloud 08.02.2019 15:30

Попробуйте использовать MatSelect на viewChild для доступа к сфокусированному атрибуту, затем onInit установите для него значение true.

<mat-form-field>
  <mat-select #mySelect [(ngModel)] = "nameField">
    <mat-option *ngFor = "let option of options2" [value] = "option.id">{{ option.name }} 
    </mat-option>
  </mat-select>
</mat-form-field>

и импорт файла ts import { MatSelect } from '@angular/material';

import { MatSelect } from '@angular/material';

export class SelectExample implements OnInit {
  @ViewChild(MatSelect) mySelect: MatSelect;

  ngOnInit() {
    this.mySelect.focused = true;
  }  
}

Это в неправильном AFAIK. Он устанавливает стиль focused, но на самом деле это не фокусирует элемент!

Elias 28.05.2019 10:24

Поскольку это первое попадание, которое появляется в Google, я предоставлю то, что нашел:

Обратите внимание, что я сделал это специально для mat-select, так как нет внутреннего html-элемента настоящий, к которому можно было бы прикрепить ссылку..

То, что я нашел, работает, это получение ссылки на элемент через view-child, а затем вызов

reference._elementRef.nativeElement.focus();

Надеюсь, это поможет хоть кому-то :)

HTML:

<mat-select #someRef >
    <mat-option *ngFor = "let item of items;" [value] = "item">
    {{item.name}}
    </mat-option>
</mat-select>

.тс : убедитесь, что вы импортируете MatSelect

import { MatSelect } from '@angular/material';
@ViewChild('someRef') someRef: MatSelect;


ngOnInit() {
    if (this.someRef) this.someRef.focus();
}

Надеюсь это поможет.

лучше всего добавить правдивую проверку на this.someRef

pcnate 14.10.2019 22:25

Использование ElementRef на Angular 9 мне не помогло, но MatSelect помог. Спасибо.

kazbeel 28.02.2020 09:14

Во-первых, давайте создадим директиву auto-focus.directive.ts

import { AfterContentInit, Directive, ElementRef, Input } from '@angular/core';

@Directive({
     selector: '[autoFocus]' }) export class AutofocusDirective implements AfterContentInit {

     public constructor(private el: ElementRef) {     
     }

     public ngAfterContentInit() {
         setTimeout(() => {
             this.el.nativeElement.focus();
         }, 500);
     }
}

Затем нам нужно сообщить нашему AppModule, что эта новая директива существует, и объявить ее доступной, обновив наш app.module.ts :

@NgModule({
    declarations: [
        AutoFocusDirective
    ]
})

Теперь вы можете использовать его в шаблоне компонента: app.component.html

<div> Autofocus? <input appAutoFocus> </div>
Ответ принят как подходящий

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

ngAfterViewInit

HTML:

<mat-select #fff>
    <mat-option *ngFor = "let food of foods" [value] = "food.value">
      {{food.viewValue}}
    </mat-option>
</mat-select>

ТС:

export class SelectOverviewExample  implements AfterViewInit{
  foods: Food[] = [
    {value: 'steak-0', viewValue: 'Steak'},
    {value: 'pizza-1', viewValue: 'Pizza'},
    {value: 'tacos-2', viewValue: 'Tacos'}
  ];

  @ViewChild("fff", {static: false}) nameField: ElementRef;

  ngAfterViewInit() {
    this.nameField.focused = true;
  }
}

Найдите рабочую демонстрацию здесь. Вы можете видеть, что выбор выделен. прокомментируйте код внутри ngAfterViewInit() и посмотрите на эту разницу.

Спасибо @Harshad vekariya, все работает нормально, как и ожидалось.

BlueCloud 21.10.2019 16:15

Как это работает для ngFor.. Я хочу сфокусировать раскрывающийся список 0 index mat

Soumya Gangamwar 29.04.2020 12:54

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

<mat-form-field>
    <mat-select formControlName = "xyz" cdkFocusInitial>
        <mat-option value = "abc">Abc</mat-option>
    </mat-select>
</mat-form-field>

Предупреждение: cdkFocusInitial ничего не делает сам по себе. Он будет работать только внутри элемента с директивой cdkTrapFocus.

j2L4e 22.02.2020 21:30

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