You can use a helper object to share data across multiple components. This is the principle behind the lightning:empApi component; it shares a connection across multiple components to multiplex a streaming API connection. I'm not going to write a full, production-ready solution for this, but I have written a demo that should get you started.
<aura:component controller="DescribeRequestController">
<aura:handler name="init" action="{!c.init}" value="{!this}" />
<aura:method name="getDescribe" action="{!c.handleDescribeRequest}">
<aura:attribute name="entityName" type="String" />
<aura:attribute name="callback" type="Function" />
</aura:method>
</aura:component>
({
init: function(component, event, helper) {
helper.init();
},
handleDescribeRequest: function(component, event, helper) {
helper.handleDescribe(component, event);
}
})
({
init: function() {
// state information
this.queue = [];
this.describes = {};
this.isInCallback = false;
},
handleDescribe: function(component, event) {
var params = event.getParams();
if(this.describes[params.entityName]) {
// We already described this!
params.callback(this.describes[params.entityName]);
} else {
// Place into queue for processing
this.queue.push(params);
this.handleDescribeCallback(component, event);
}
},
handleDescribeCallback: function(component, event) {
// We're waiting on other results
if(this.isInCallback) {
return;
}
this.isInCallback = true;
var action = component.get("c.getDescribe");
action.setParams({entityName: this.queue[0].entityName });
action.setCallback(this, function(result) {
// We're not busy after this
this.isInCallback = false;
this.describes[this.queue[0].entityName] = JSON.parse(result.getReturnValue());
// Find all pending items that were waiting for this describe, do callback
this.queue.filter(item => this.describes[item.entityName])
.forEach(item => item.callback(this.describes[item.entityName]));
// Remove all those items we just dispatched
this.queue = this.queue.filter(item => !this.describes[item.entityName]);
// If we have any more work to do, let's do so
if(this.queue.length) {
this.handleDescribeCallback(component, event);
}
});
}
})
public class DescribeRequestController {
@AuraEnabled public static String getDescribe(String entityName) {
HttpRequest req = new HttpRequest();
req.setMethod('GET');
req.setEndpoint(
'callout:salesforce/services/data/v43.0/sobjects/'+
entityName+'/describe');
return new http().send(req).getBody();
}
}
This code, of course, doesn't have any error handling, and should not be considered production-ready, but it should demonstrate enough technique to get you to a viable solution. Once you have the describe info, you'll have the "validFor" bitmap, which you'll need to parse yourself. See this answer for how to parse this bitmap.
Best Answer
This ability to set default values for dependent picklist values was not brought to Cases, which is why it's not working for you.
It's not expected to work, currently, for Cases. You'll have to look at using a different mechanism for this if setting a default value is a blocker. A Flow screen could handle setting the default values, but that assumes there's not a large amount of fields on the page layout that you'd have to re-create.