Опция выбора со значением по умолчанию, неопределенным с обязательным атрибутом, не работает, но значение пустое

У меня выпадающий список стран

<select  #countryInput  name="country" [(ngModel)]="room.countryId"   required>
  <option   [selected] [value]="undefined">Select Country</option>
  <option *ngFor="let c of countries" [value]="c.id">{{c.name}}</option>
</select>

Чтобы выбрать опцию "Выбрать страну", необходимо установить [value]="undefined", иначе она не будет отображаться в качестве выбора по умолчанию вместо пустого выбора.

Даже если поле помечено как обязательное, при отправке формы обязательное не будет отображаться, как для

<option value="">Select Country</option> 

который является поведением по умолчанию в HTML 5:

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

if (this.room.country == undefined) {
   alert('select country ');
   return false;
}

Что может быть решением для поля с [value]="undefined" и отображением предупреждения "Пожалуйста, сначала выберите элемент"?

Смотрите раздвоенную скрипку от Даниэля

2 ответа

Чтобы установить значение заполнителя по вашему выбору, установите состояние модели на null и добавить опцию с null значение. Требуемое состояние будет недействительным null как опция, которая установит недопустимую форму, а конкретный элемент управления будет недействительным. Вы можете обработать сообщение проверки любым удобным для вас способом.

С реактивными формами

В вашем шаблоне

<form [formGroup]="form">
    <select [(ngModel)]="country" formControlName="country">
      <option [ngValue]="null">Choose a state</option>
      <option *ngFor="let option of items;"[ngValue]="option">{{option.name}}</option>
  </select>
</form>

и в вашем компоненте

form = new FormGroup({
country: new FormControl(null, Validators.required)

С шаблонно-управляемыми формами

В вашем шаблоне

<form #f="ngForm">
  <select name="countryTemplateForm" [ngModel]="countryTemplateForm" required>
    <option [ngValue]="null">Choose a country</option>
    <option *ngFor="let country of countries" [ngValue]="country">
      {{ country.name }}
    </option>
  </select>
</form>

и в вашем компоненте

countryTemplateForm = null;
countries = [
  { name: 'USA'},
  { name: 'India' },
  { name: 'France' }
];

Посмотрите на этот пример StackBlitz!

У меня также была та же проблема, используя следующие решил проблему для меня

 <select class="o-field__input" [disabled]="isAnswerPresent" [(ngModel)]="inputValue" (change)="onAnswerChange()" required>
                <option [ngValue]="undefined">placeholder</option>

                <option [ngValue]="option" *ngFor="let option of optionSet;">option values</option>                     

            </select>

Установка значения состояния выбора для пустой строки <option value="">Choose a state</option>, а в тс файл объявить myDropDown пустая строка также, решит проблему.

 myDropDown = '';

или же

 myDropDown= this.items[0].id;

HTML

 <form ngNativeValidate>
   <select [(ngModel)]="myDropDown"  (ngModelChange)="onChangeofOptions($event)" 
    required [ngModelOptions]="{standalone: true}">
     <option value="">Choose a state</option>
     <option *ngFor="let option of items;"[value]="option.id">{{option.name}}</option>
   </select>
   <input [hidden]="myDropDown !=='two'"type="text">
   <input type="submit" value="submit form">
  </form>
Другие вопросы по тегам