Je veux avoir une sélection avec des options qui sont lues à partir d'autres entrées et quand l'entrée change, ma sélection change aussi.
Toutes les sélections et les entrées sont des formes réactives. Le problème est que lorsque je modifie la valeur des entrées, les options de sélection ne sont mises à jour que lorsque je fixe la valeur des options au contrôle de formulaire. Si je fixe la valeur des options à la valeur du contrôle de formulaire, elles ne sont pas mises à jour.
L'exemple de code est ici : https://stackblitz.com/edit/angular-5zfocw
Modèle :
<form [formGroup]="form">
<div formArrayName="opts" *ngFor="let opt of form.get('opts').controls; let i = index">
<div [formGroupName]="i">
{{i}}:
<input type="text" formControlName="name">
</div>
</div>
</form>
<form [formGroup]="form">
<label> Selection:</label>
<select formControlName="selection">
<option *ngFor="let opt of form.get('opts').controls; let i=index" [value]="opt.value.name">
{{opt.value.name}}
</option>
</select>
</form>
<hr>
<pre>
selection: {{ form.get('selection').value | json}}
</pre>
Compoent :
import { Component } from '@angular/core';
import { FormBuilder, FormGroup, FormArray } from '@angular/forms';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
public form: FormGroup
constructor(private fb: FormBuilder){
this.form = this.fb.group({
opts: this.fb.array([
this.fb.group({name: ['N0']}),
this.fb.group({name: ['N1']}),
this.fb.group({name: ['N2']})
]),
selection: [{value: {}}]
})
}
}
Si je change la ligne 13 du modèle HTML en :
<option *ngFor="let opt of form.get('opts').controls; let i=index" [value]="opt">
Ensuite, l'option et l'entrée sont parfaitement synchronisées. Cependant, je ne suis pas en mesure d'obtenir la valeur de la sélection.
Si la ligne est changée en [value]="opt.value.name"
puis sélectionner N2, puis changer l'entrée N2, ma sélection sera perdue et la valeur ne sera pas mise à jour.
ce que je veux
Je veux 1. Sélectionner N2 dans le menu déroulant. 2. Changer N2 en quelque chose d'autre comme N22 dans l'entrée. 3. La sélection doit être mise à jour en N22. Et la valeur N22 doit être affichée en bas de la page.
Que dois-je faire ?