Angular 7反应形式如何获取选定值的文本,而不是下拉列表形式控件中的值

时间:2018-12-05 12:59:39

标签: angular angular-reactive-forms angular7 formarray

我有一种方法来获取下拉列表中所选值的文本,而不是以反应形式获取值?

我的脚本如下:

<form [formGroup]="formGroup" formArrayName="test">
    <ng-container matColumnDef="fr" formArrayName="test">
            <th mat-header-cell *matHeaderCellDef> Family Rel. </th>
            <td mat-cell *matCellDef="let element; let i = index;">
              <div [formGroupName]="i">
                <mat-form-field color="warn" >
                    <mat-label>Family Relation</mat-label>
                    <mat-select (selectionChange)="onChange(element, i)" id="family_relation" formControlName="fr" placeholder="Family Relation">                 
                          <mat-option *ngFor="let familyRelation of familyRelationArray;" [value]="familyRelation.family_relation_id">
                        {{familyRelation.family_relation_type}}
                      </mat-option>
                    </mat-select>
                  </mat-form-field>&nbsp;
                </div>
            </td>
          </ng-container>
</form>

在更改选择(selectionChange="onChange(element, i)")上,我需要同时获取所选的值和其文本。

onChange(data, i)
  {
    let group = (<FormArray>this.formGroup.get('test')).at(i).value;
    let newFr = group['fr'];
    console.log('Value: '+newFr);
  }

其中数据是所选行,i是所选表单数组的索引。

我尝试使用旧的javascript方法:

<HTMLSelectElement>document.getElementById().text

但这给了我一个错误:

  

[ts]类型“ HTMLElement”上不存在属性“文本”。 [2339]

编辑

我尝试过:

@ViewChild('familyRelation') familyRelation;

并且:

<mat-select #familyRelation (selectionChange)="onChange(element, i)" id="family_relation" formControlName="fr" placeholder="Family Relation">                 
                      <mat-option *ngFor="let familyRelation of familyRelationArray;" [value]="familyRelation.family_relation_id">
                    {{familyRelation.family_relation_type}}
                  </mat-option>
                </mat-select>

安慰后:

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:1)

首先,从表单控件获取值。然后通过遍历数组获得与值相关的项目。最后从项目

中获取文本
onChange(data, i)
  {
    let text = formGroup.get("fr").value;
    let newFr =this.familyRelationArray.find((item) => item.family_relation_id === text)
    if(newFr){
        console.log('text: '+newFr.family_relation_type); 
    }
  }

答案 1 :(得分:0)

根据您的评论,您需要一种通用的方式来访问html元素。 Angular提供了easy way to do so

<mat-select #selectFamilyRelation
            (selectionChange)="onChange()" 
            id="family_relation" 
            formControlName="fr" 
            placeholder="Family Relation">                 
  <mat-option *ngFor="let familyRelation of familyRelationArray;" 
              [value]="familyRelation.family_relation_id">
    {{familyRelation.family_relation_type}}
  </mat-option>
</mat-select>

在组件内部:

创建一个class属性: @ViewChild('selectFamilyRelation') familyRelation;

然后获取所选选项的文本:

onChange() {
  const selectedOptionText = this.familyRelation._elementRef.nativeElement.innerText;
  // ...
}