You need to sign in to do that
Don't have an account?
recordForm cache/refresh - showing OLD data
A lightning:recordForm component is showing old data.
The SF database definitely has fresher data, a SELECT confirms the server has newer data.
Destroying & re-creating the lightning:recordForm doesn't have an affect, it still shows old data. Refreshing the entire browser page does refresh the component.
On a high level there are two components.
A parent accountManager that creates a child accountForm
The child accountForm contains the Lightning:recordForm and comms with an external server.
The child will detect when it needs to refresh and will emit an event, the parent handles the event by destroying the child and creates a new child.
This new child is the problem child, it keeps showing stale data.
Any way to switch off caching, or refresh a recordForm component?
Parent Component
CHILD COMPONENT
The SF database definitely has fresher data, a SELECT confirms the server has newer data.
Destroying & re-creating the lightning:recordForm doesn't have an affect, it still shows old data. Refreshing the entire browser page does refresh the component.
On a high level there are two components.
A parent accountManager that creates a child accountForm
The child accountForm contains the Lightning:recordForm and comms with an external server.
The child will detect when it needs to refresh and will emit an event, the parent handles the event by destroying the child and creates a new child.
This new child is the problem child, it keeps showing stale data.
Any way to switch off caching, or refresh a recordForm component?
Parent Component
<!-- AccountManager.cmp --> <aura:component controller='CRAccountGetService' implements='flexipage:availableForRecordHome,force:hasRecordId,force:hasSObjectName' access='global'> <!-- Attributes--> <aura:attribute name='recordId' type='string' default='{! v.recordId }' access='global' /> <aura:attribute name='sObjectName' type='string' access='global' /> <!-- Handlers --> <aura:handler name='init' value='{! this }' action='{! c.handleInit }' /> <aura:handler name="refreshAccountForm" event="c:CRRefreshAccountForm" action='{! c.handleRefreshAccountForm }' /> <!-- Screen --> <div> <!-- AccountForm dynamically injected here --> {! v.body } </div> </aura:component>
// AccountManagerController.js ({ handleInit: function(component, event, helper) { helper.newAccountForm(component); }, // handler for child component refresh event. Destroy & recreate account form component handleRefreshAccountForm: function(component, event, helper) { var eventMsg = event.getParam('message'); helper.showToast('Account', eventMsg, 'error', 5000, 'sticky' ); // destroy existing Account form child component var body = component.get("v.body"); var arrayLength = body.length; for (var i = 0; i < arrayLength; i++) { body[i].destroy; } component.set('v.body',[]); // create new Account form child component var recId = component.get('v.recordId'); $A.createComponent("c:AccountForm", { 'recordId': recId }, function (newAccountForm, status, errorMsg) { if (status === "SUCCESS") { component.set("v.body", newAccountForm); } else { // show error } }); }, })
CHILD COMPONENT
<!-- AccountForm.cmp --> <aura:component controller='CRAccountGetService' implements='flexipage:availableForAllPageTypes, flexipage:availableForRecordHome, force:hasRecordId, force:hasSObjectName' access='global' > <aura:handler name='init' value='{! this }' action='{! c.handleInit }' /> <!-- Event to let parent (manager) know we need to be refreshed --> <aura:registerEvent name="refreshAccountForm" type="c:CRRefreshAccountForm" /> <aura:attribute name='recordId' type='string' default='{! v.recordId }' access='global' /> <aura:attribute name='mode' type='string' default='view' access='global' /> <!-- Screen --> <lightning:messages /> <lightning:recordForm aura:id='accountForm' objectApiName='Account' recordId='{! v.recordId }' layoutType='Full' columns='2' mode='{! v.mode }' onsuccess='{! c.handleSuccess }' /> </aura:component>
// AccountFormController.js ({ // After a successful save to SF database, call external service handleSuccess: function(component, event, helper) { helper.callExternalService(component, event, helper).then ( // promise resolved: external server accepted data. SF database unchanged $A.getCallback(function () { helper.showToast('Account Save', 'All good', 'success', 1000); }), // promise rejected: external server rejected data and overwrote values in SF database, // fire event so the Manager (the parent component) refreshes the form view $A.getCallback(function (message) { var refreshMeEvent = component.getEvent("refreshAccountForm"); refreshMeEvent.setParam("message", message); refreshMeEvent.fire(); }) ); }, })
// AccountFormHelper.js ({ callExternalService: function(component,event, helper) { return new Promise($A.getCallback(function(resolve, reject) { var externalService = component.get('c.callExternalService'); externalService.setParams({ 'accountId': component.get('v.recordId') }); externalService.setCallback(this, function(response) { if (response.getState() === "SUCCESS") { var rspMsg = JSON.parse(response.getReturnValue()); if (rspMsg.success) { resolve(); } else { reject(rspMsg.message); } } else { reject('Controller failure:' + response.getState()); } }); $A.enqueueAction(externalService); })); }, })
Please refer a screenshot.
Thanks, this option was already disabled (unchecked)
And I disabled Lightning Debig mode for my user account.
I also tried the browser Devtools setting: Network:'Disable cache (while dev tools is open)
Thank you
Investigating further ... I added a button on the Parent (AccountManager) to Destroy the child and re-create the child. (copy 'n paste code from AccountManagerController.handleRefreshAccountForm)
destoying and re-creating the child multiple times makes no difference, old data still shows.
Is it possible to tell recordForm to ignore cache or somehow trick it into doing a clean fetch