2

I am trying to pass a string from my Lightning Component to an Apex controller, but when it is received by the Controller it is interpreted as null. The controller works fine and is returning data, but only when it does not process the parameter. Any advice? I have seen that there are other questions similar to this, but I have not found any applicable answers; I did find one that said "paste into a new component and try again." is that really the only fix?

component:

<aura:component
    description="Shelter Nightly Attendance" 
    controller="ShelterNightlyAttendanceController"
    implements="force:appHostable">
<!-- attributes -->
<aura:attribute name="bedNightWrappers" type="BedNightWrapper[]"/>
<aura:attribute name="bedNightDate" type="Date" default=""/>
<aura:attribute name="MorningChore" type="String" default=""/>
<aura:attribute name="EveningChore" type="String" default=""/>

<!-- handlers -->
<aura:handler name="init" value="{!this}" action="{!c.doInit}"/>

<!-- page -->
<ui:inputDate label="Attendance for:" value="{!v.bedNightDate}" displayDatePicker="true" />

<table class="slds-table slds-table--bordered slds-table--cell-buffer slds-table--fixed-layout">
    <thead>
    <th>Bed Night Id</th>
    </thead>
    <tbody>
    <aura:if isTrue="{!!empty(v.bedNightWrappers)}">
        <aura:iteration var="bedNightWrapper" items="{!v.bedNightWrappers}" >
            <tr onclick="{!c.selectRecord}">
                <td><ui:outputText value="{!bedNightWrapper.bedNightId}"/></td>
                <td><c:getPicklist label="Evening Chore" objectName="Bed_Night__c" fieldName="Evening_Chore__c" value="{!bedNightWrapper.eveningChore}"/></td>
                <td><c:getPicklist label="Morning Chore" objectName="Bed_Night__c" fieldName="Morning_Chore__c" value="{!bedNightWrapper.morningChore}"/></td>
                <td><ui:outputText value="{!bedNightWrapper.dateOfStay}"/></td>
            </tr>
        </aura:iteration>
    </aura:if>
    </tbody>
</table>
</aura:component>

controller:

({
doInit : function(component, event, helper) {
    var today = helper.getToday();
    component.set('v.bedNightDate', today);
    helper.getBedNightWrappers(component, today);
},

getBedNights : function(component, event, helper) {
    var date = component.get('v.bedNightDate');
    helper.getBedNightWrappers(component, date);
}
});

helper:

({
getToday: function () {
    var today = new Date();
    var monthDigit = today.getMonth() + 1;
    if (monthDigit <= 9) {
        monthDigit = '0' + monthDigit;
    }
    var dayDigit = today.getDate();
    if (dayDigit <= 9) {
        dayDigit = '0' + dayDigit;
    }
    var dateString = today.getFullYear() + "-" + monthDigit + "-" + dayDigit;
    console.log("typeof dateString: " + typeof dateString); // returns string
    return dateString;
},

getBedNightWrappers: function (component, date) {

    var action = component.get("c.getBedNightWrappersServer");
    console.log("Hello from getBedNightWrappers (JS)! " +
        "date: " + date + ", typeof date: " + typeof date); // returns "2018-03-16", string

    action.setParam({
        "bedNightDate" : date
    });
    //Setting the Callback
    action.setCallback(this, function (a) {
        //get the response state
        var state = a.getState();

        //handle the response state
        switch (state) {
            case "SUCCESS":
                var result = a.getReturnValue();
                if (!$A.util.isEmpty(result) && !$A.util.isUndefined(result))
                    component.set("v.bedNightWrappers", result);

                break;
            case "ERROR":
                console.log(a);
                var errors = a.getError();
                alert('Error in calling server side action for getBedNightWrappers.' +
                    errors[0].message); // reports that "an internal server error occured" when I process the date param
                break;
            default:
                return;

        }
    });

    //adds the server-side action to the queue
    $A.enqueueAction(action);
}
});

Apex class:

public class ShelterNightlyAttendanceController {

@AuraEnabled
public static List<BedNightWrapper> getBedNightWrappersServer(String bedNightDate) {
    System.debug('hello from getBedNightWrappersServer (Apex)! ' +
            'bedNightDate: ' + bedNightDate); // returns null
    //Date queryDate = Date.parse(bedNightDate);

    List<Bed_Night__c> bedNights = [SELECT Id,
            Date_Of_Stay__c,
            Evening_Chore__c,
            Morning_Chore__c
    FROM Bed_Night__c /*WHERE Date_Of_Stay__c = :queryDate*/];
    List<BedNightWrapper> bedNightWrappers = new List<BedNightWrapper>();
    If(bedNights.size() > 0) {
        for(Bed_Night__c bedNight : bedNights) {
            bedNightWrappers.add(new BedNightWrapper(bedNight));
        }
    }
    return bedNightWrappers;
}
}

wrapper class:

public class BedNightWrapper {
@AuraEnabled public Id bedNightId;
@AuraEnabled public Date dateOfStay;
@AuraEnabled public String eveningChore;
@AuraEnabled public String morningChore;

public BedNightWrapper() {
    bedNightId = null;
    dateOfStay = null;
    eveningChore = null;
    morningChore = null;
}

public BedNightWrapper(Bed_Night__c bedNight) {
    this.bedNightId = bedNight.Id;
    this.dateOfStay = bedNight.Date_Of_Stay__c;
    this.eveningChore = bedNight.Evening_Chore__c;
    this.morningChore = bedNight.Morning_Chore__c;
}
}

I am banging my head against the wall - I am using primitives so I didn't think I would face any translation issues.

5

I'm pretty sure its just because your

setParam

should be setParams(---) instead. documented example at Calling a Server-Side Action

action.setParams({ firstName : cmp.get("v.firstName") });
| improve this answer | |
  • setParam does work, but as two parameters (e.g. setParam('firstName',cmp.get('v.firstName')). In this case, yes, your assumption should be correct. – sfdcfox Mar 17 '18 at 0:41
  • i might be confused, but isint this --> firstName : cmp.get("v.firstName") only 1 parameter? and 'firstName',cmp.get('v.firstName') 2 parameters? – glls Mar 17 '18 at 0:56
  • setParam takes two parameters, the name to set, followed by the value. It's better to use setParams anyways. – sfdcfox Mar 17 '18 at 1:08

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.