Подтвердить что ты не робот

Выпадающий список в Angular 2 моделированный привод

У меня есть модель, управляемая формой, в которой я хотел бы добавить раскрывающийся список, содержащий несколько параметров. Параметры указаны из предварительно заданного списка, а модель формы вводится компоненту. Форма загружена правильно: все поля из модели заполнены правильно, а также список параметров для раскрывающегося списка также загружен правильно.
Единственная проблема заключается в том, что я не могу установить значение selected в списке, и сначала он появляется с пустым значением.

Здесь я загружаю список HMOs, затем загружаю пациента и только затем создаю форму.
Все значения формы (имя, id и т.д., Опущенные здесь) загружаются правильно в форму.
Выпадающий список в форме заполняется правильно: все HMOs заполняют список.
Тем не менее, выбранное значение в списке отсутствует, а потеря загружается без начального значения.
Для целей отладки я заменил логическое условие в теге option: patient.hmo.uid == hmo.uid на вызов функции: isSelected(hmo).
Эта функция по существу делает то же сравнение и возвращает свое значение, но сначала регистрирует его. Действительно, я вижу, что опция с правильным hmo получает значение true, а все остальные параметры получают значения false, что означает, что все данные загружены правильно.

Кроме того, когда я устанавливаю [selected]="true" (всегда, чтобы быть правдой), я вижу, что изменения влияют: последний параметр выбран (по умолчанию в HTML).

Итак, где я ошибаюсь? Как правильно установить выбранный параметр?

Код для компонента (все поля, кроме HMO, опущены):

import {Component, Input, Inject, OnInit} from "@angular/core";
import {
  FormGroup,
  FormControl,
  REACTIVE_FORM_DIRECTIVES,
  Validators,
  FormBuilder,
  FormArray
} from "@angular/forms";
import {Patient} from "./patient";
import {PatientsService} from "./patients.service";
import {Hmo} from "../hmos/hmo";
import {HmosService} from "../hmos/hmos.service";
import {Doctor} from "../doctors/doctor";
import {DoctorsService} from "../doctors/doctors.service";
import {Router, ActivatedRoute} from "@angular/router";
import {Subscription} from "rxjs/Rx";
import {Response} from "@angular/http";
import {JavaDate} from "./java-date";

@Component({
  moduleId: module.id,
  selector: 'gy-patient-edit',
  templateUrl: 'patient-edit.component.html',
  directives: [REACTIVE_FORM_DIRECTIVES],
})
export class PatientEditComponent implements OnInit {

  patientForm: FormGroup;

  @Input() patient: Patient;
  private hmos: Hmo[];
  private patientUid: number;
  private showForm: boolean = false;

  constructor(@Inject(PatientsService) private patientsService: PatientsService,
              @Inject(HmosService) private hmosService: HmosService,
              @Inject(ActivatedRoute) private route: ActivatedRoute,
              @Inject(FormBuilder) private formBuilder: FormBuilder) {
  }

  ngOnInit(): any {
    this.subscription = this.route.params.subscribe(
      (params: any) => {
        this.patientUid = params['id']; //Getting the UID from the URL
      }
    );
    this.hmosService.hmosChanged.subscribe(
      (hmos: Hmo[]) => {
        this.hmos = hmos; //Fetching available HMOs
      }
    );
    this.hmosService.fetchHmos();
    this.patientsService.fetchPatient(this.patientUid) //Fetching the Patient
      .map((response: Response) => response.json())
      .subscribe((data: Patient) => {
        this.patient = data;
        this.restartForm(); //Only required so the form will ne initialized only after the patient is received from the server
      });
  }

  restartForm(){
    this.patientForm = this.formBuilder.group({
      hmo: [this.patient.hmo]]
    });
    this.showForm = true;
  }

  ngOnDestroy() {
    this.subscription.unsubscribe();
  }

}

Код для HTML-формы:

<div class="row" *ngIf="showForm">
  <div class="col-xs-12" *ngIf="showForm">
    <form [formGroup]="patientForm" (ngSubmit)="onSubmit()">
      <div class="form-group">
        <label for="hmo">HMO</label>
        <select formControlName="hmo" id="hmo">
          <option *ngFor="let hmo of hmos"
                  [value]="hmo.uid" [selected]="patient.hmo.uid == hmo.uid">
            {{hmo.name}}
          </option>
        </select>
    </form>
  </div>
</div>

Код для Patient:

import {Hmo} from "../hmos/hmo";
export class Patient {
  constructor(public hmo: Hmo) {

  }
}

Код для Hmo:

export class Hmo{
  constructor(public uid: number, public name: string){}
}
4b9b3361

Ответ 1

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

Ваш код может быть слегка изменен следующим образом:

  restartForm(){
    this.patientForm = this.formBuilder.group({
      hmo: [this.patient.hmo.uid]
    });
    this.showForm = true;
  }

И Шаблон:

<select formControlName="hmo" id="hmo">
   <option *ngFor="let hmo of hmos"
     [value]="hmo.uid">
        {{hmo.name}}
   </option>
</select>