1. 程式人生 > >Angular 4/5 form表單select初始化選中(簡單string和複雜物件)

Angular 4/5 form表單select初始化選中(簡單string和複雜物件)

1.問題場景

管理員增刪改查中的“改”操作。管理員有性別(sex)和崗位(position)屬性。其中,性別在後端為列舉型別,position為類。
要求進入管理員修改頁時,自動選擇性別,通過介面獲取所有崗位,並自動選中當前管理員的崗位。

2.實現思路

在元件的ngOnInit()方法中,首先使用FormBuilder構建表單。然後分別通過管理員查詢介面和崗位列表查詢介面,獲取當前管理員的資訊和所有崗位資訊:

ngOnInit() {

    const formBuilder = new FormBuilder();
    this.editForm = formBuilder.group
({ id: [''], sex: ['MALE'], position: ['', [Validators.required]] }); this.jobPositionService.findAll().subscribe( data => { this.jobPositions = data.content; } ); const id = this.routeInfo.snapshot.params['id']; if (id > 0
) { this.operatorService.detail(id).subscribe( data => { this.editForm.reset({ id: data.id, sex: data.sex, position: data.position }); } ); } }

通過<pre>{{editForm.value | json}}</pre>

顯示當前表單內容:
這裡寫圖片描述

3.select選中問題

html程式碼:

<div class="form-group">
    <label for="sex" class="col-sm-2 control-label">性別</label>
    <div class="col-sm-10">
        <select name="sex" id="sex" formControlName="sex" class="form-control">
            <option value="MALE"></option>
            <option value="FEMALE"></option>
        </select>
    </div>
</div>
<div class="form-group">
    <label for="position" class="col-sm-2 control-label">崗位</label>
    <div class="col-sm-10">
        <select name="position" id="position" formControlName="position"
                class="form-control">
            <option *ngFor="let position of jobPositions" [ngValue]="position">
                {{position.desp}}
            </option>
        </select>
    </div>
</div>

select選中效果:
性別自動選中,但是崗位未選中
這裡寫圖片描述

4.問題分析

通過測試,當前管理員的position和jobPositions的任一元素均不相等(===),雖然在後端資料庫中為同一記錄。

5.問題解決

<select name="position" id="position" formControlName="position"
        [compareWith]="compareFn"
        class="form-control">
    <option *ngFor="let position of jobPositions" [ngValue]="position">
        {{position.desp}}
    </option>
</select>

 compareFn(o1: Object, o2: Object): boolean {
     return o1 && o2 ? o1['id'] === o2['id'] : o1 === o2;
 }

這裡寫圖片描述