In my lightning component I have sObject list which I render as data table. Some of the cells/fields are editable and onChange of those fields I recalculate other fields.
In my lightning component Helper method (called via controller when field value changes), I call another helper method and pass the field name as String which I need to update. Is there a way to dynamically reference that field and update it's value?
//Helper Method 1
calculateSegmentsAmounts : function(component, event, helper) {
var prepayRecord = component.get("v.prepaymentRecord");
var segmentsList = component.get("v.prepaymentSegmentsList");
var calculatedTotalPercentage = 0;
var calculatedTotalPrincipal = 0;
var calculatedTotalInterest = 0;
var calculatedTotalPremium = 0;
var calculatedTotalBreakage = 0;
var calculatedTotalOther = 0;
for(var i=0; i < segmentsList.length; i++) {
var percentage = 0;
var principal = 0;
if(segmentsList[i].Selected__c) {
percentage = segmentsList[i].PAR_Percentage__c / 100;
principal = percentage * prepayRecord.Native_Principal__c;
segmentsList[i].Interest__c = percentage * prepayRecord.Native_Interest__c;
segmentsList[i].Premium__c = percentage * prepayRecord.Native_Premium__c;
segmentsList[i].Breakage__c = percentage * prepayRecord.Native_Breakage__c;
segmentsList[i].Other__c = percentage * prepayRecord.Native_Other__c;
segmentsList[i].Total_Segment__c = principal + segmentsList[i].Interest__c + segmentsList[i].Premium__c + segmentsList[i].Breakage__c + segmentsList[i].Other__c;
}
percentage = percentage * 100;
calculatedTotalPercentage += percentage;
segmentsList[i].Principal__c = principal;
calculatedTotalPrincipal += segmentsList[i].Principal__c;
calculatedTotalInterest += segmentsList[i].Interest__c;
calculatedTotalPremium += segmentsList[i].Premium__c;
calculatedTotalBreakage += segmentsList[i].Breakage__c;
calculatedTotalOther += segmentsList[i].Other__c;
} // Loop ends
// Update attribute value because it will be referred in below Helper methods
component.set("v.prepaymentSegmentsList", segmentsList);
var reCalcTotal = false;
if(calculatedTotalPercentage == 100.00000000000) {
if(calculatedTotalPrincipal != 0 && calculatedTotalPrincipal != prepayRecord.Native_Principal__c) {
helper.adjustExtraAmount(component, event, helper, prepayRecord.Native_Principal__c, calculatedTotalPrincipal, "Principal__c"); // Passing Field name as String
reCalcTotal = true;
}
if(calculatedTotalInterest != 0 && calculatedTotalInterest != prepayRecord.Native_Interest__c) {
helper.adjustExtraAmount(component, event, helper, prepayRecord.Native_Interest__c, calculatedTotalInterest, "Interest__c"); // Passing Field name as String
reCalcTotal = true;
}
if(calculatedTotalPremium != 0 && calculatedTotalPremium != prepayRecord.Native_Premium__c) {
helper.adjustExtraAmount(component, event, helper, prepayRecord.Native_Premium__c, calculatedTotalPremium, "Premium__c"); // Passing Field name as String
reCalcTotal = true;
}
if(calculatedTotalBreakage != 0 && calculatedTotalBreakage != prepayRecord.Native_Breakage__c) {
helper.adjustExtraAmount(component, event, helper, prepayRecord.Native_Breakage__c, calculatedTotalBreakage, "Breakage__c"); // Passing Field name as String
reCalcTotal = true;
}
if(calculatedTotalOther != 0 && calculatedTotalOther != prepayRecord.Native_Other__c) {
helper.adjustExtraAmount(component, event, helper, prepayRecord.Native_Other__c, calculatedTotalOther, "Other__c"); // Passing Field name as String
reCalcTotal = true;
}
if(reCalcTotal) {
helper.reCalculateSegmentsRowTotal();
}
}
component.set("v.prepaymentRecord", prepayRecord);
component.set("v.prepaymentSegmentsList", segmentsList);
},
//Helper Method 2
adjustExtraAmount : function(component, event, helper, nativeAmount, calculatedTotal, fieldName) {
var segmentsList = component.get("v.prepaymentSegmentsList");
var multiplier = 100;
var difference = (Math.round(multiplier * nativeAmount) - Math.round(multiplier * calculatedTotal)) / multiplier;
var absdiff = Math.abs(difference);
var calculatedMoreThanActual;
if(nativeAmount < calculatedTotal) {
calculatedMoreThanActual = true;
}
else {
calculatedMoreThanActual = false;
}
if (absdiff >= 0.01 && absdiff < 1) {
var affliatedInvIndex = helper.getLargestaffiliatedINVIndex(component, event, helper, fieldName); // Another Helper to which fieldName is passed
if (affliatedInvIndex == -1) {
affliatedInvIndex = helper.getLargestSegmentIndex(component, event, helper, fieldName); // Another Helper to which fieldName is passed
}
var nonAffliatedInvIndex = helper.getLowestNonAffiliatedINVIndex(component, event, helper, fieldName); // Another Helper to which fieldName is passed
if (nonAffliatedInvIndex == -1) {
nonAffliatedInvIndex = helper.getLowestSegmentIndex(component, event, helper, fieldName); // Another Helper to which fieldName is passed
}
var runOnce = false;
console.log('>>>> Recalculating ' + fieldName);
for(var i=0; i < segmentsList.length; i++) {
if(segmentsList[i].Selected__c) {
var oldValue = 0;
oldValue = segmentsList[i].fieldName; // Need to dynamically fetch the value
if(calculatedMoreThanActual) {
if (i == nonAffliatedInvIndex && !runOnce) {
var delta = oldValue + difference;
segmentsList[i].fieldName = delta; // Need to dynamically Update the value
runOnce = true;
}
}
else {
if (i == affliatedInvIndex && !runOnce ) {
var delta = oldValue + difference;
segmentsList[i].fieldName = delta; // Need to dynamically Update the value
runOnce = true;
}
}
}
}
}
component.set("v.prepaymentSegmentsList", segmentsList);
},
segmentsList[i][fieldName]
. It works fine for me.