Установить опцию по умолчанию в mat-select

У меня есть простое поле формы выбора в моем проекте материалов Angular:

component.html

  <mat-form-field>
    <mat-select [(value)] = "modeSelect" placeholder = "Mode">
      <mat-option value = "domain">Domain</mat-option>
      <mat-option value = "exact">Exact</mat-option>
    </mat-select>
  </mat-form-field>

Где [(value)] = "modeSelect" привязан к свойству modeSelect в файле component.ts

Я хочу сделать так, чтобы <mat-option value = "domain">Domain</mat-option> был выбран по умолчанию при загрузке страницы.

ng-selected у меня не работал

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
81
0
170 418
12
Перейти к ответу Данный вопрос помечен как решенный

Ответы 12

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

Рабочий StackBlitz

Нет необходимости использовать ngModel или формы

В вашем html:

 <mat-form-field>
  <mat-select [(value)] = "selected" placeholder = "Mode">
    <mat-option value = "domain">Domain</mat-option>
    <mat-option value = "exact">Exact</mat-option>
  </mat-select>
</mat-form-field>

и в вашем компоненте просто установите для своего общедоступного свойства selected значение по умолчанию:

selected = 'domain';

Привет! спасибо за ответ, вот что я получил, когда попробовал: не могу выполнить привязку к 'selected', так как это не известное свойство 'mat-option'.

cup_of 01.06.2018 23:13

ах вроде работает в вашем примере, но не в моем. есть ли конкретный модуль, который мне нужно импортировать в свой appmodule.ts?

cup_of 01.06.2018 23:29

Какую версию Angular и Angular Material вы используете?

Narm 01.06.2018 23:31

угловой материал 6.2.0 и угловой 6.0.3

cup_of 01.06.2018 23:33

Все, что вам нужно импортировать в свой модуль для этого примера, - это import {MatSelectModule} from '@angular/material';. Это у тебя есть?

Narm 01.06.2018 23:36

да у меня есть это. в любом случае, теперь он работает! Спасибо

cup_of 01.06.2018 23:38

Как это сделать для множественного выбора? Я пробовал с этим, и он не работает <mat-select [(value)] = "selected" placeholder = "Mode" multiple> .ts file: selected = ['domain, точный'];

aswininayak 15.10.2018 22:04

@Narm это неправильный способ двусторонней привязки.

Irrfan23 24.11.2019 09:56

У меня это не работает. Ничего, что я помещаю в атрибут [(value)], не отображается в mat-select.

ChumiestBucket 04.12.2019 22:46

Это почти сработало для меня, он устанавливал выбранное значение, но не инициализировал элемент управления формы для отображения правильного значения визуально при загрузке. В файле .ts мне также пришлось добавить в ngOnInit (): this.myForm.controls.myControl.setValue("defaultValue")

Emilie 22.12.2019 21:53

Для информации вам необходимо убедиться, что тип данных значения по умолчанию совпадает с типом данных параметров, например, <mat-select [(value)] = "heroes [0] .id"> <mat-option * ngFor = "let hero of heroes" [value] = "hero.id"> {{hero.name}} </mat-option> </mat-select> будет работать. Но если вы присвоите строковый тип [(значение)], это не сработает.

Subbu 30.03.2020 10:00

@Subbu Большое спасибо за указание на проблему dataType. Я потратил на это 3 часа. Также мне пришлось вызвать setValue ().

romal tandel 13.08.2020 14:42

@romaltandel, добро пожаловать и рад, что помогло :)

Subbu 13.08.2020 20:45

У меня есть многоразовый компонент, для которого я пытаюсь установить значение по умолчанию, и я не знаю значение, которое будет использоваться по умолчанию, поскольку параметры меняются в зависимости от ввода. Поэтому я не могу сделать selected = 'some value' в моем компоненте. <div> <mat-form-field> <mat-label> {{enumType}} </mat-label> <mat-select [(value)] = "carList [0]" обязательно> <mat-option * ngFor = "let car carList" [value] = "car"> {{car}} </mat-option> </mat-select> </mat-form-field> </div> В моем компоненте я не уверен, как с этим справиться или как вызвать setValue (), поскольку я не использую форму.

Nick 05.03.2021 20:43

Попробуй это:

<mat-select [(ngModel)] = "defaultValue">
export class AppComponent {
  defaultValue = 'domain';
}

привет, я получаю эту ошибку, когда пытаюсь ответить: Ошибка: если ngModel используется в теге формы, необходимо установить либо атрибут name, либо элемент управления формы должен быть определен как «автономный» в ngModelOptions.

cup_of 01.06.2018 23:15

у вас есть мат-форма-поле?

yer 01.06.2018 23:18

Попробуй это

<mat-form-field>
    <mat-select [(ngModel)] = "modeselect" [placeholder] = "modeselect">
        <mat-option value = "domain">Domain</mat-option>
        <mat-option value = "exact">Exact</mat-option>
    </mat-select>
</mat-form-field>

Составная часть:

export class SelectValueBindingExample {
    public modeselect = 'Domain';
}

Живая демонстрация

Также не забудьте импортировать FormsModule в свой app.module.

Привет, это делает свойство modeselect = 'domain', но, похоже, не выбирает вариант домена по умолчанию

cup_of 01.06.2018 23:25

Я обновил свой ответ, пожалуйста, проверьте рабочий стек

Vikas 01.06.2018 23:28

Привет, Викас, в * ng есть динамические значения, на тот момент как показать с помощью id?

Dharmesh 12.09.2018 13:38

@AmishaRana Вы имели в виду, как показать значение по умолчанию, если данные динамические ??

Vikas 12.09.2018 14:34

@AmishaRana Взгляните на этот stackblitz

Vikas 12.09.2018 14:45
I was able to set the default value or whatever value using the following:

Template:
          <mat-form-field>
              <mat-label>Holiday Destination</mat-label>
              <mat-select [(ngModel)] = "selectedCity" formControlName = "cityHoliday">
                <mat-option [value] = "nyc">New York</mat-option>
                <mat-option [value] = "london">London</mat-option>
                <mat-option [value] = "india">Delhi</mat-option>
                <mat-option [value] = "Oslo">Oslo</mat-option>
              </mat-select>
          </mat-form-field>

Component:

export class WhateverComponent implements OnInit{

selectedCity: string;    

}

ngOnInit() {
    this.selectedCity = 'london';
} 

}

HTML

<mat-form-field>
<mat-select [(ngModel)] = "modeSelect" placeholder = "Mode">
  <mat-option *ngFor = "let obj of Array"  [value] = "obj.value">{{obj.value}}</mat-option>
</mat-select>

Теперь установите значение по умолчанию на

modeSelect

, где вы получаете значения в переменной Array.

Некоторое время меня волновал этот вопрос. Я использовал реактивные формы и исправил этим методом. PS. Использование Angular 9 и Material 9.

В хуке жизненного цикла "ngOnInit"

1) Получите объект, который вы хотите установить по умолчанию, из вашего массива или литерала объекта

const countryDefault = this.countries.find(c => c.number === '826');

Здесь я беру объект Соединенного Королевства из своего массива стран.

2) Затем установите объект FormBuilder (mat-select) со значением по умолчанию.

this.addressForm.get('country').setValue(countryDefault.name);

3) Наконец ... установите свойство связанного значения. В моем случае мне нужно значение имени.

<mat-select formControlName = "country">
   <mat-option *ngFor = "let country of countries" [value] = "country.name" >
          {{country.name}}

  </mat-option>
</mat-select>

Работает как шарм. Я надеюсь, что это помогает

Это тот, который работает с angular 9 или выше. Спасибо!!!

Joey587 30.11.2020 17:40

Обычно вы собираетесь сделать это в своем шаблоне с помощью FormGroup, Reactive Forms и т. д.

    this.myForm = this.fb.group({
      title: ['', Validators.required],
      description: ['', Validators.required],
      isPublished: ['false',Validators.required]
    });

Я хотел бы добавить сюда ответ Нарм и добавить то же самое, что и комментарий под ее ответом.

Обычно тип данных значения, присвоенного [(value)], должен соответствовать типу данных атрибута [value], используемого для mat-options. Особенно, если кто-то заполняет параметры, используя * ngFor, как показано ниже

<mat-form-field fxHide.gt-sm='true'>
        <mat-select [(value)] = "heroes[0].id">
          <mat-option *ngFor = "let hero of heroes" [value] = "hero.id">{{ hero.name }}</mat-option>
        </mat-select>
</mat-form-field>

Обратите внимание: если вы измените [(value)] = "heroes [0] .id" на [(value)] = "heroes [0] .name", это не будет работать, поскольку типы данных не совпадают.

Это мои выводы, пожалуйста, не стесняйтесь исправлять меня, если это необходимо.

Проблема в том, что если герои "еще" не содержат данных, выдаст ошибку.

Jnr 31.05.2021 11:12

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

Subbu 11.06.2021 11:52

Если ваш источник данных heroes поступил с сервера, вы получите сообщение об ошибке. Это не ошибка индекса вне диапазона, потому что в id нет heroes. Если вы считаете это несущественным, но верным, просто игнорируйте его и не понижайте его, потому что это может помочь кому-то другому.

Jnr 11.06.2021 15:45

Для вашей информации, я только что прокомментировал, чтобы прояснить вашу проблему (вы получаете сообщение об ошибке? Если да, в чем ошибка?). Кроме того, если в ответе, возвращаемом сервером, как правило, в ответ на вызов api, есть ошибка, следует позаботиться о проверке работоспособности и предпринять соответствующие действия на уровне службы, а пользовательский интерфейс должен отображать соответствующие сообщения. Не проголосовали против и не намерены. Пожалуйста, всегда перепроверяйте, прежде чем давать такие комментарии.

Subbu 11.06.2021 16:41

Мои извинения. Итак, в вашем сценарии на стороне клиента просто будет ошибка, потому что объект heroes не имеет данных, если он поступает с сервера. Представление пытается отобразить heroes, но все еще ожидает ответа сервера.

Jnr 12.06.2021 09:27

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

stackoverflow.com/help/how-to-answer Поможет дать исчерпывающий ответ
Swinkaran 21.04.2020 08:34

Использование модели формы (реактивные формы)

--- Html code--
<form [formGroup] = "patientCategory">
<mat-form-field class = "full-width">
    <mat-select placeholder = "Category" formControlName = "patientCategory">
        <mat-option>--</mat-option>
        <mat-option *ngFor = "let category of patientCategories" [value] = "category">
            {{category.name}} 
        </mat-option>
    </mat-select>
</mat-form-field>

---- код ts ---

ngOnInit() {

        this.patientCategory = this.fb.group({
            patientCategory: [null, Validators.required]
        });

      const toSelect = "Your Default Value";
      this.patientCategory.get('patientCategory').setValue(toSelect);
    }

Без формы Модель

--- html code --
<mat-form-field>
  <mat-label>Select an option</mat-label>
  <mat-select [(value)] = "selected">
    <mat-option>None</mat-option>
    <mat-option value = "option1">Option 1</mat-option>
    <mat-option value = "option2">Option 2</mat-option>
    <mat-option value = "option3">Option 3</mat-option>
  </mat-select>
</mat-form-field>

---- код ts - selected = 'option1'; Здесь позаботьтесь о типе присвоения значения

On your typescript file, just assign this domain on modeSelect on Your ngOnInit() method like below:



 ngOnInit() {
        this.modeSelect = "domain";
      }

И в своем HTML используйте свой список выбора.

<mat-form-field>
        <mat-select  [(value)] = "modeSelect" placeholder = "Mode">
          <mat-option value = "domain">Domain</mat-option>
          <mat-option value = "exact">Exact</mat-option>
        </mat-select>
      </mat-form-field>

Прочтите это, если вы заполняете свой mat-select асинхронно через HTTP-запрос.

Если вы используете службу для выполнения вызова api для возврата значений параметров выбора mat-select, вы должны установить «выбранное значение» в элементе управления формы как часть «завершенного» раздела вашего вызова api службы subscribe ().

Например:

  this.customerService.getCustomers().subscribe(
  customers => this.customers = customers ,
  error => this.errorMessage = error as any,
  () => this.customerSelectControl.setValue(this.mySelectedValue));

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