[SalesForce] remove error message in javascript in lwc

I have a text input field serial number and a toggle button.serial number is required by default. So, if serial number is left blank then it will display error message.
But,If the toggle button is checked then error message from serial number should be removed. But it continues to display the error message.

html

<template>
<lightning-input class="serialnumber" label ="serial 
  number" name="serialnumber" onchange= {handleChange} required={isRequired}
                          message-when-value-missing="serial Number is req">
</lightning-input>
  <!--toggle html>
  <label class="slds-checkbox_toggle slds-truncate"> 
  <input type="checkbox" name="infoToggle" checked={infoToggleValue} 
                                           onchange={handleChange} />
  <span class="slds-checkbox_on slds-text-body_small">not required</span>
  <span class="slds-checkbox_off slds-text-body_small">required</span>
  </label>
</template>

js

import { LightningElement, track} from 'lwc';
export default class CmpInputScreen extends LightningElement {

@track serialNumber;
@track infoToggleValue = false;
get isRequired(){
    if(this.infoToggleValue){
        return false;
    } return true;
}
handleChange(event) {
    const inputName = event.target.name;
    if (inputName === 'serialnumber') {
        this.serialNumber= event.target.value;
    }else if(inputName === 'infoToggle'){
        //it gets set to true when checked and isRequired sets to false
        this.infoToggleValue = event.target.checked; 
        if(this.infoToggleValue){
           let inputEle = this.template.querySelector('.serialnumber');
            inputEle.setCustomValidity("");
            inputEle.reportValidity();
          }
        }
       }
} 

Best Answer

It's a matter of asynchronous rendering. When you update the value of this.infoToggleValue, you need to allow some time for the isRequired expression to get re-evaluated in your template before reporting validity.

You need to wrap your call to reportValidity in a resolved Promise to let the framework do a rerender in the meantime.

handleChange(event) {
    const inputName = event.target.name;
    if (inputName === 'serialnumber') {
        this.serialNumber = event.target.value;
    } else if (inputName === 'infoToggle') {
        //it gets set to true when checked and isRequired sets to false
        this.infoToggleValue = event.target.checked;
    }
    // Revalidate serial number
    Promise.resolve().then(() => {
        const inputEle = this.template.querySelector('.serialnumber');
        inputEle.reportValidity();
    });
}

Edit: force revalidation of serial number in all cases.

Related Topic