Recently, I was in need of Lightning Component, which can poll Apex class at regular interval and display status of some process running in background. Initially, I thought its very easy and straight forward. Just like we do in Visualforce, use window.setInterval method of Javascript and I came up with below code.
RefreshContactCounter.cls
/**
* @Author : Jitendra Zaa
* @Date : Nov-09-2016
* @Desc : This class is used by LEX component - PollApexClass
* : It returns total number of contacts in system
* */
public class RefreshContactCounter {
@AuraEnabled
public static Integer getContactCount(){
AggregateResult[] groupedResults = [SELECT count(Id) totalCount FROM Contact];
Object totalCount = groupedResults[0].get('totalCount');
return (Integer) totalCount ;
}
}
PollApexClass.cmp
<aura:component controller="RefreshContactCounter">
<aura:attribute type="Decimal" name="contactCount" />
<aura:handler name="init" value="{!this}" action="{!c.doInit}" />
<div class="slds">
<article class="slds-card slds-card--narrow">
<div class="slds-card__header slds-grid">
<header class="slds-media slds-media--center slds-has-flexi-truncate">
<div class="slds-media__figure">
<c:svg xlinkHref="/resource/SLDS_2_0_3/assets/icons/standard-sprite/svg/symbols.svg#contact" class="slds-icon slds-icon-standard-contact slds-icon--small" />
</div>
<div class="slds-media__body slds-truncate">
<h2>
<span class="slds-text-heading--small"> Total Contacts in system</span>
</h2>
</div>
</header>
</div>
<div class="slds-card__body slds-align--absolute-center slds-text-heading--large"> {!v.contactCount }</div>
<div class="slds-card__footer"> Refresh rate - every 5 seconds </div>
</article>
</div>
</aura:component>
PollApexClassController.js
({
doInit : function(component, event, helper) {
helper.pollApex(component, event, helper);
}
})
PollApexClassHelper.js
({
pollApex : function(component, event, helper) {
helper.callApexMethod(component,helper);
//execute callApexMethod() again after 5 sec each
window.setInterval(helper.callApexMethod(component,helper),
5000,);
},
handleResponse : function (response, component){
var retVal = response.getReturnValue() ;
component.set("v.contactCount",retVal);
},
callApexMethod : function (component,helper){
var action = component.get("c.getContactCount");
action.setCallback(this, function(response) {
this.handleResponse(response, component);
});
$A.enqueueAction(action);
}
})
In above helper javascript file, we are using window.setInterval() method of Javascript, to call Apex class at interval of 5sec.
DemoApp.app
<aura:application >
<ltng:require styles="/resource/SLDS_2_0_3/assets/styles/salesforce-lightning-design-system.css" />
<c:PollApexClass />
</aura:application>
If we try to run above application, it doesn’t work as expected and returns below error

After going through documentation, I came across this page, which hints how we can modify Lightning component’s content outside its lifecycle.
In PollApexClassHelper.js file, we just need to change method pollApex by below code :
pollApex : function(component, event, helper) {
helper.callApexMethod(component,helper);
//execute callApexMethod() again after 5 sec each
window.setInterval(
$A.getCallback(function() {
helper.callApexMethod(component,helper);
}), 5000
);
}
Demo :


Leave a Reply to MuraliCancel reply