Как получить индекс выбранной опции вне выбора в Angular?

У меня есть простой <select> в Angular (с материалом) следующим образом:

<mat-form-field>
  <mat-label>Type</mat-label>
  <mat-select placeholder = "Type" formControlName = "type" name = "type" id = "name">
    <mat-option>None</mat-option>
    <mat-option *ngFor = "let t of types" [value] = "t">
      {{t}} <-- it is enum -->
    </mat-option>
  </mat-select>
</mat-form-field>

Я хотел бы использовать индекс выбранного типа в другой части кода.

Точнее: в *ngFor другого select. Поэтому я не могу использовать documentById.

Кроме того, я не хочу устанавливать jQuery только для этого.

Является ли это возможным?

Улучшение производительности загрузки с помощью 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 страниц, которые помогут...
3
0
7 338
3

Ответы 3

Вы можете просто установить переменную [(ngModel)] и использовать ее для получения индекса

<mat-select placeholder = "Type" [(ngModel)] = "selected" formControlName = "type" name = "type" id = "name">
    <mat-option>None</mat-option>
    <mat-option *ngFor = "let t of types" [value] = "t">
      {{t}} <-- it is enum -->
    </mat-option>
</mat-select>

а затем в компоненте используйте

this.index = this.types.findIndex(item => item === selected);

Как предлагает этот пример документации по материалам Angular, вы можете привязать к [(value)] двумя способами:

<mat-form-field>
  <mat-select [(value)] = "selected">
    <mat-option>None</mat-option>
    <mat-option *ngFor = "let t of types; let i = index" [value] = "i">{{t}}</mat-option>
  </mat-select>
</mat-form-field>

<p>You selected: {{selected}}</p>

selected будет собственностью вашего класса.

Вот Рабочий StackBlitz от Angular Team для справки.

Спасибо за ответ, но, к сожалению, мне нужно отправить значение типа в почтовом запросе, поэтому в моем случае я не могу использовать это решение ...

plkpiotr 03.10.2018 23:11

Согласно ответу Саджитарана, использование ngModel вместе с реактивной формой не рекомендуется, а также устарело. Вместо этого следите за изменениями элемента управления формы, найдите индекс и сохраните его в переменной для дальнейшего использования. Вот пример:

myForm: FormGroup;

idx: number;
foods = ['Steak', 'pizza-1'];

constructor(private fb: FormBuilder) { }

ngOnInit() {
  this.myForm = this.fb.group({
    mySelect: ['']
  });

  this.myForm.get('mySelect').valueChanges.subscribe((value) => {
    this.idx = this.foods.findIndex(val => val === value);
    console.info(this.idx)
  });
}

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