反应形式-通过条件动态设置<select> FormControl的选定<option>的输入

时间:2020-04-06 20:45:43

标签: javascript jquery angular multidimensional-array angular-reactive-forms

我需要根据

中的选择选项设置两个inout值

我有一个带有选项的数组,当用户在输入中选择一个选项时,必须设置数组的另一个选项。 示例:当我选择选项“ Risco de alergias”时,一个输入已设置为“ Orientar o acientgia aempgias em caso de troca de coberturas e medicamentos”。和其他输入已设置为数组riscos的“ Pacientenãodevera apresentar alergias durante aexecuçãodo Tratamento”值

https://stackblitz.com/edit/angular-lii4rh

component.ts

import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, FormArray, FormControl } from '@angular/forms'


@Component({
    selector: 'my-app',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
    planoCuidadosForm: FormGroup;
    risco: FormArray;


    riscos = [
        {
            Risco: "Risco de alergias",
            Cuidados:
            "Orientar o paciente a sempre informar as alergias em caso de troca de coberturas e medicamentos.",
            Resultado:
            "Paciente não devera apresentar alergias durante a execução do tratamento"
        },
        {
            Risco: "Risco de baixa autoestima ",
            Cuidados:
            "Promover conforto psicológico ao paciente visando a promoção da autoestima",
            Resultado:
            "Paciente não devera apresentar alterações da autoestima durante a execução do tratamento"
        },
        {
            Risco: "Risco de distúrbio na identidade pessoal",
            Cuidados:
            "Auxiliar o paciente no processo de aceitação com as condições atuais",
            Resultado:
            "Paciente não devera apresentar disturbios na identidade pessoal durante a execução do tratamento"
        }
    ];

    constructor(
        private datePipe: DatePipe,
        private fb: FormBuilder,
    ) { }   

    ngOnInit() {
        this.createFormPlanos();
    }

    createFormPlanos() {
        this.planoCuidadosForm = this.fb.group({
            planoDeCuidadosId: [null],
            evolucao: [null],
            riscos: this.buildRiscos(),
        });

    }

    buildRiscos() {
        return this.fb.array([
            this.fb.group({
            Risco: "",
            Cuidados: "",
            Resultado: ""
            })
        ]);
    }

    addRiscos(): void {
        this.risco = this.planoCuidadosForm.get("riscos") as FormArray;
        this.risco.push(this.buildRiscos());
    }

    get getRiscos(): FormArray {
        return this.planoCuidadosForm.get('riscos') as FormArray;
    }

    selRiscos(event: any) {
        console.log("Risco: ", event.target.value)

        const id = this.riscos.find(r => r.Risco == event.target.value);
        console.log("Id: ", id);

        (this.planoCuidadosForm.get(['riscos']) as FormArray)
        .patchValue([{ Risco: id.Risco, Cuidados: id.Cuidados, Resultado: id.Resultado }]);

    }

}

component.html

<form class="form-horizontal ml-2 mr-2 mt-2" [formGroup]="planoCuidadosForm" (ngSubmit)="onSubmitPlanoCuidados()">
    <div class="form-row">
        <div class="form-group col-md-12">
            <label for="evolucao">Evolução:</label>
            <textarea class="form-control" id="evolucao" rows="3" formControlName="evolucao"></textarea>
        </div>
    </div>
    <div formArrayName="riscos" class="form-group col-md">
        <table class="table table-hover">
            <thead>
                <tr class="bg-primary text-light">
                    <th style="width: 20%">Riscos</th>
                    <th style="width: 40%">Cuidados Relacionados aos riscos</th>
                    <th style="width: 30%">Resultado Esperado</th>
                    <th style="width: 5%">
                    <button type="button" class="btn btn-sm btn-primary flex-end mt-auto" (click)="addRiscos()">
                    <i class="fas fa-plus"></i>
                    </button>
                    </th>
                </tr>
            </thead>
            <tbody>
                <tr class="table-light" *ngFor=" let item of getRiscos.controls;let i = index;">
                    <td>
                        <select class="form-control" [formControlName]="i" (change)="selRiscos($event)">
                            <option [value]="null"> -- Selecione -- </option>
                            <option *ngFor="let opcao of riscos;let op = index;" value="riscos.Risco"> {{opcao.Risco }} </option>
                        </select>
                    </td>
                    <td>
                        <input type="text" class="form-control" formControlName="Cuidados" id="Cuidados" />
                    </td>
                    <td>
                        <input type="text" class="form-control" formControlName="Resultado" id="Resultado" />
                    </td>
                </tr>
            </tbody>
        </table>
    </div>
</form>

1 个答案:

答案 0 :(得分:0)

您有一个FormGroup的FormArray,因此您需要使用

<!--see that use [formGroupName]="i" in the tag with *ngFor-->
<tr class="table-light" *ngFor=" let item of getRiscos.controls;let i = index;"
       [formGroupName]="i">
   <td>
   <!--see that you use formControlName="Risco"-->
    <select class="form-control" formControlName="Risco" (change)="selRiscos($event)">
        <!--I prefer use [ngValue] over value-->
        <option [ngValue]="null"> -- Selecione -- </option>
        <option *ngFor="let opcao of riscos;let op = index;" [ngValue]="opcao.Risco"> 
             {{opcao.Risco }} 
        </option>
    </select>
   </td>
   ...
</tr>

您的函数buildRisco应该返回一个formGroup,而不是FormArray,否则您的函数addRiscos()没有意义-您正在推送FormArray

 buildRiscos() {
   return group=this.fb.group({
        Risco: "",
        Cuidados: "",
        Resultado: ""
      })

并在创建表单时使用

createFormPlanos() {
    this.planoCuidadosForm = this.fb.group({
      planoDeCuidadosId: [null],
      evolucao: [null],
      riscos: this.fb.array([this.buildRiscos()]), //<--here put the formArray
     });

  }

好吧,如果我们想控制“反应形式”中的cange,建议订阅.html中的valuesChanges(不使用(更改)),因此您的buildRiscos函数最终变为

buildRiscos() {
   const group=this.fb.group({
        Risco: "",
        Cuidados: "",
        Resultado: ""
      })

    group.get('Risco').valueChanges.subscribe(res=>{
        const risco=this.riscos.find(r => r.Risco == res);
        group.get('Cuidados').setValue(risco?risco.Cuidados:null)
        group.get('Resultado').setValue(risco?risco.Resultado:null)
    })
    return group
  }

注意:好的,(很长的回答很抱歉)如果您没有计划更改字段“ cuidados”和“ Resultado”,那么确实。您可以在选择的[ngValue] =“ opcao”中使用,而不使用其他输入{{risco.Cuidados}}和{{risco.Resultado}}

在这种情况下是FormControls的FormArray

 this.form=this.fb.group({
   riscos:this.fb.array([this.fb.control(null)])
 })

因此,您使用[formControlName] =“ i”

<form *ngIf="form" [formGroup]="form">
    <div formArrayName="riscos" class="form-group col-md">
        <tr *ngFor="let item of getRiscos2.controls;let i=index">
            <select class="form-control" [formControlName]="i" >
         <option [ngValue]="null"> -- Selecione -- </option>
         <option *ngFor="let opcao of riscos;let op = index;" [ngValue]="opcao"> {{opcao.Risco }} </option>
      </select>
        <td>{{getRiscos2.value[i]?.Cuidados}}</td>
        <td>{{getRiscos2.value[i]?.Resultado}}</td>
        </tr>
    </div>
</form>

看到,整个对象都是[ngValue] =“ opcao”!多数民众赞成在允许我们使用getRiscos2.value [i] .Cuidados

我为your stackblitz提供了所有这些概念,希望对您有帮助