Выпадающий список в форме Angular 2 Model Driven



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

Единственная проблема заключается в том, что я не могу установить значение selected списка, и он сначала появляется с пустым значением.



Здесь, Я загружаю список Hmo, затем загружаю пациента и только потом создаю форму.

Все значения формы (имя, идентификатор и т. д. которые здесь опущены) загружаются правильно в форму.

Раскрывающийся список в форме заполнен правильно: все НМО заполняют список.

Тем не менее, выбранное значение в списке отсутствует, а потерянное загружается без начального значения.

Для отладки Я заменил логическое условие в теге option: patient.hmo.uid == hmo.uid на функцию вызов: isSelected(hmo).

Эта функция, по сути, делает то же самое сравнение и возвращает свое значение, но сначала регистрирует его. Действительно, я вижу, что опция с правильным hmo получает значение true, а все другие опции получают значения false, то есть все данные загружаются правильно.



Также, когда я устанавливаю [selected]="true" (всегда должно быть 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){}
}
638   1  

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>

Comments

    Ничего не найдено.