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 theisRequired
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.Edit: force revalidation of serial number in all cases.