I have 2 inputs on a form, a numeric input called "ageMonths", and a date selector called "dateOfBirth".
I want the user to be able to enter either months for an age, or use the date selector to pick a Date of Birth (dob). If they enter a dob from the date selector, I want the month field to update to the age in months. If they enter an age in months, I want the date selector to jump to that date. I'm using reactive forms.
I added a class level variable to hold a toggle which is read and set each time a value changes for either control. But this isn't working as expected, I assume due to events not firing in the order I am expecting them to.
What do I need to do to make this work?
My code is:
ignoreDateUpdate = false;
form: FormGroup;
...
constructor(...){
this.form = new FormGroup({
    dateOfBirth: new FormControl({ value: new Date()}),
    ageMonths: new FormControl({ value: 0 }),
    ...
});
...
this.form.get('ageMonths').valueChanges.subscribe(
m => {
    if (ignoreDateUpdates) {return};
    ignoreDateUpdates = true;
    <code to set DateSelectorValue>
    ignoreDateUpdates = false;
    });
this.form.get('dateOfBirth').valueChanges.subscribe(
dob => {
    if (ignoreDateUpdates) {return};
    ignoreDateUpdates = true;
    <code to set MonthsInput>
    ignoreDateUpdates = false;
});
}
I'm answering this as I've got the required behaviour by adding the {emitEvent: false} option to my setValue calls:
const calcDate = <calculate date from months value>;
this.form.get('dateOfBirth').setValue(calcDate, { emitEvent: false });
But I'd still like to know why the toggle field didn't work as expected if anyone can explain?
i also implemented this kind of functionality in my app,i have two input box one is hour and second is minutes whenever user enter value in hours then i convert hour into minutes and update minutes input box,when user enter minutes in minutes input box then i convert minutes into hours and update hour input box.
private  ignoreDateUpdates=true;        
this.form.get('ageMonths').valueChanges.subscribe(m => {
        if (ignoreDateUpdates) {
        ignoreDateUpdates = false;
        <code to set DateSelectorValue>
         }
        else{
      ignoreDateUpdates = true;
         }       
 });
    this.form.get('dateOfBirth').valueChanges.subscribe(
    dob => {
        if (ignoreDateUpdates) {
        ignoreDateUpdates = false;
        <code to set MonthsInput>
       }
        else{
        ignoreDateUpdates = true;
      }    
});
    }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With