Как получить идентификатор выбранного значения в опции Mat-Select в Angular 5

Как получить идентификатор значения выбранной опции в mat-select angular 5. Получить только значение выбранной опции в onchangeevent. но как получить идентификатор выбранного значения параметра.

 client.component.html
<mat-form-field>
    <mat-select placeholder="Client*" #clientValue  (change)="changeClient($event)">
    <mat-option  *ngFor="let client of clientDetails"   [value]="client.clientName">
      {{client.clientName |  json}}
    </mat-option>
  </mat-select>
</mat-form-field>

client.component.ts file
export class Client{
     changeClient(event){
     console.log(event);
 }
}

person AtmanSangeetha    schedule 09.02.2018    source источник


Ответы (4)


Для этого вам необходимо:

Измените (change)="changeClient($event)" на (change)="changeClient($event.value)"

и с [value]="client.clientName" на [value]="client.id"

<mat-form-field>
    <mat-select placeholder="Client*" #clientValue  (change)="changeClient($event.value)">
    <mat-option  *ngFor="let client of clientDetails"   [value]="client.id">
      {{client.clientName}}
    </mat-option>
  </mat-select>
</mat-form-field>

РАБОЧАЯ ДЕМО

person Vivek Doshi    schedule 09.02.2018
comment
Спасибо. Теперь я получаю идентификатор выбранного значения. - person AtmanSangeetha; 09.02.2018
comment
Но мне нужны значение и идентификатор как в событии changeclient. Для этого [значение] = client.id +, + client.value и changeClient ($ event.value) ... это способ получить оба значения или любой другой способ получить его - person AtmanSangeetha; 09.02.2018
comment
@AtmanSangeetha, я добавил оба в демо, пожалуйста, посмотрите. Пожалуйста, проголосуйте также за ответ :) - person Vivek Doshi; 09.02.2018
comment
,Спасибо. Я получил и идентификатор, и значение. - person AtmanSangeetha; 10.02.2018
comment
Понятно, но как получить выбранный индекс из mat-select? - person K T; 28.06.2018
comment
@KT, в рабочей демонстрации changeClient2 получает индекс выбранного элемента, проверьте - person Vivek Doshi; 28.06.2018
comment
@VivekDoshi .............. не могли бы вы помочь мне с этой проблемой ..? - person Heena; 06.09.2018
comment
@ Хина, какой? - person Vivek Doshi; 06.09.2018
comment
о, мне очень жаль .. пропустил добавить ссылку ...... stackoverflow.com/questions/52188340/ .. пожалуйста, посмотрите - person Heena; 06.09.2018
comment
@VivekDoshi ... не могли бы вы предложить мне какое-нибудь решение ...? - person Heena; 06.09.2018
comment
Спасибо. Я использовал field.name вместо id. - person Raj Rajeshwar Singh Rathore; 16.05.2019

Вопрос специфичен для Angular 5, но для других, приходящих сюда с более новой версией Angular, событие (change) не будет работать для mat-select.

В Angular 6 событие (change) было изменено на (selectionChange).

Так было бы:

<mat-form-field>
    <mat-select placeholder="Client*" #clientValue  (selectionChange)="changeClient($event.value)">
    <mat-option  *ngFor="let client of clientDetails" [value]="client.id">
      {{client.clientName}}
    </mat-option>
  </mat-select>
</mat-form-field>

И в компоненте:

changeClient(value) {
    console.log(value);
}

Из этого ответа и документация.

person Stack Underflow    schedule 09.01.2019
comment
Спасибо тебе за это. Я искал это в течение часа. - person sasi; 26.01.2019
comment
В angular 8 он работает с (selectionChange). Спасибо - person Anjali Sharma; 26.10.2020

Вы также можете подписаться на изменение значений mat-select с помощью декоратора ViewChild и ngAfterViewInit, который менее "html-навязчивый".

Вот пример:

[HTML]

<mat-form-field [floatLabel]="auto">
    <mat-label>Type</mat-label>
        <mat-select #matSelect required> //the #matSelect is important here
            <mat-option *ngFor="let type of types" [value]="type.value">
                {{type.viewValue}}
            </mat-option>
    </mat-select>
</mat-form-field>

[TS]

 import { Component, ViewChild, AfterViewInit } from '@angular/core';
 import { MatSelect } from '@angular/material';

 @Component({
        selector: 'app-export-security-pack-material',
        templateUrl: './export-security-pack-material.component.html',
        styleUrls: ['./export-security-pack-material.component.scss']
 })

 export class ExportSecurityPackMaterialComponent implements AfterViewInit {

    constructor() {}

    types: Object[] = [
        { value: 'example-value-0', viewValue: 'ExampleViewValue0' 
        },
        { value: 'example-value-1', viewValue: 'ExampleViewValue1' }
    ];

    @ViewChild('matSelect') matSelect: MatSelect;
       //Reference Variable //variable Name //Type

    ngAfterViewInit() {
        this.matSelect.valueChange.subscribe(value => {
            console.log(value);
        });
    }
 }

При этом ваше значение должно регистрироваться в консоли разработки Ctrl+Shift+I или F12 каждый раз, когда вы меняете значение селектора.

или вы можете буквально просто сделать это, если вам не нужно onchange:

[HTML]

<mat-form-field [floatLabel]="auto">
    <mat-label>Type</mat-label>
        <mat-select [(value)]="matSelectValue" required> <---
            <mat-option *ngFor="let type of types" [value]="type.value">
                {{type.viewValue}}
            </mat-option>
    </mat-select>
</mat-form-field>
person Noé KlK    schedule 11.08.2019

Компонент => app.component.ts

import { Component, OnInit } from '@angular/core';
import { FormGroup, FormControl, Validators } from '@angular/forms';
import { MaterialDropDown, PAYMENT_MODES } from './order.model';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})

export class AppComponent implements OnInit {
  name = 'Angular';
  sampleForm: FormGroup;
  paymentModes: MaterialDropDown[];
  constructor() {}

  ngOnInit() {
    this.paymentModes = PAYMENT_MODES;
    this.sampleForm = new FormGroup({
      payment_mode: new FormControl(null, Validators.required),
    });
  }

  get f() {
    return this.sampleForm.controls;
  }

  onPaymentSelection() {
    console.log(this.sampleForm.value.payment_mode);
  }

  onSubmit() {
    console.log(this.sampleForm.value);
  }
}

Модуль => app.module.ts

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';

import { AppComponent } from './app.component';
import { HelloComponent } from './hello.component';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatSelectModule } from '@angular/material/select';
import { MatButtonModule } from '@angular/material/button';
@NgModule({
  imports: [ 
    BrowserModule, 
    BrowserAnimationsModule,
    FormsModule, 
    ReactiveFormsModule, 
    MatFormFieldModule, 
    MatSelectModule,
    MatButtonModule
    ],
  declarations: [ AppComponent, HelloComponent ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }

Модель => order.model.ts

export interface MaterialDropDown {
    value: string;
    viewValue: string;
}

export const PAYMENT_MODES: MaterialDropDown[] = [
    { value: 'Cash', viewValue: 'Cash' },
    { value: 'cheque', viewValue: 'Cheque' },
    { value: 'dd', viewValue: 'Demand Draft' },
    { value: 'neft', viewValue: 'NEFT' },
    { value: 'rtgs', viewValue: 'RTGS' },
    { value: 'upi', viewValue: 'UPI' }
];

View => app.component.html

<form [formGroup]="sampleForm" (ngSubmit)="onSubmit()">
    <mat-form-field>
        <mat-label>Payment Mode</mat-label>
        <mat-select formControlName="payment_mode" (ngModelChange)="onPaymentSelection($event)">
            <mat-option *ngFor="let payment_mode of paymentModes" [value]="payment_mode.value">
                {{ payment_mode.viewValue }}
            </mat-option>
        </mat-select>
        <mat-hint *ngIf="!f.touched">Please select a valid Payment Mode.</mat-hint>
        <div *ngIf="!f.payment_mode.valid && f.payment_mode.touched">
            <mat-error *ngIf="f.payment_mode.errors.required">Payment Mode field is required</mat-error>
        </div>
    </mat-form-field>
  <button type="submit" mat-raised-button color="primary" [disabled]="sampleForm.invalid">Save</button>
</form>
<p style="color: #f00">Check Console for outputs</p>

CSS => app.component.css

mat-form-field { width: 280px; margin-right: 35px}

РАБОЧАЯ ДЕМО

person Mohd Abdul Baquee    schedule 10.01.2020