[SalesForce]

I have a <lightning:recordViewForm in a custom lightning component.

When I hardcode the recordId attribute it works, but when I pass an attribute in it fails without any error messages in either the console or the debug log.

Component

<aura:handler name="init" value="{!this}" action="{!c.doInit}" />
<aura:attribute name="recordId" type="Id"></aura:attribute>

<lightning:recordViewForm recordId="{! v.recordId }" objectApiName="MyCustomObject__c">

    <lightning:outputField fieldName="Name" />

</lightning:recordViewForm>

JavaScript Controller

doInit : function(cmp, event, helper) {

    // var recordId = helper.getQueryStringParameter('recordId');

    cmp.set("v.recordId", "a0C4E000003YMkmUAG");
}

The above does not work, even if I put the recordId directly into the attribute.

It only works when I set the Id in the recordId attribute of the <lightning:recordViewForm like below:

<lightning:recordViewForm recordId="a0C4E000003YMkmUAG" objectApiName="MyCustomObject__c">

    <lightning:outputField fieldName="Name" />

</lightning:recordViewForm>

Best Answer

The recordViewForm (and similar siblings) are very finicky with the recordId attribute. Not sure if this is just a quirk or bug but try wrapping it with an <aura:if isTrue="{! not( empty( v.recordId ) ) }">

Basically, in my experience working with it, it needs the attribute ready before it's placed in the render cycle.

It just so happens <aura:if> doesn't initiate a render of the component until its conditions are truthy.