So the background layer directive now listens to gaTopicChange and gaLanguageChange events. This sounds like too much responsibility on the background layer directive (and other directives that will rely on the gaLayers service in the future). It does not make sense to me that the background layer directive must know that the layers must be loaded again when the language changes. That's knowledge the background layer directive need not have.

And the reloadTopic function looks hackish to me. Also, I don't think that its name actually captures the action it performs. The gaLayers service doesn't load topics, it loads layers.

Anyway, that suggests to me that a better design should be found.

Here's something I'd try: the gaLayers service itself, instead of the background layer directive, listens to gaTopicChange and gaLanguageChange events. And when such an event occurs the gaLayers service naturally loads new layers from the layersconfig service. And one new layers have been loaded it broadcasts a gaLayersChange event. Directives like the background layer directive just listen to gaLayersChange events. So they no longer need to know that the topic or language has changed, they just react on "layers changed" events, which is the only thing they need to know really. And with that design gaLayers.getBackgroundLayers and friends can even directly return the expected data directly instead of a promise.

This obviously would need to be implemented to know if that actually works.