A good reactive solution that does not require the addition of (change)listeners would be to create two separate name controls and synchronize them by subscribing to the stream valueChanges.
component.ts
import { Component, NgModule, ViewChild } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormBuilder, FormControl, FormGroup } from '@angular/forms';
@Component({
selector: 'my-app',
templateUrl: 'app.component.html'
})
export class AppComponent {
form: FormGroup;
constructor(private fb: FormBuilder) {
this.form = this.fb.group({
nameText: '',
nameSelect: '',
})
const text = this.form.get('nameText');
const select = this.form.get('nameSelect');
text.valueChanges.subscribe(v => select.setValue(v, { emitEvent: false }));
select.valueChanges.subscribe(v => text.setValue(v, { emitEvent: false }));
}
}
component.html
<form [formGroup]="form">
When you change the input, the select changes : <br>
<input type="text" formControlName="nameText"><br>
When you change the select, the input does not change : <br>
<select formControlName="nameSelect">
<option value="value1">value1</option>
<option value="value2">value2</option>
</select>
</form>
Live demo
source
share