Search code examples
angularjsangularjs-provider

Angular: Optionally configure a service


I have a service that has an internal list of directive names (lets call it listService). In the spirit of loosely coupled applications I want other modules to be able to add their own directives to that list instead of statically defining it in the service module.

I understand that I can create a provider in order to configure a service like this:

app.provider("listService", ServiceProvider);

app.config(["listServiceProvider", function(listServiceProvider) {
    listServiceProvider.add("myDirective");
}]);

At the same time, I don't want all the modules that define directives to depend on the service. So what I would like to do is "if this service is used in this project: configure it; else: ignore".

Unfortunately, the above code produces a module error if listServiceProvider is not available. I also tried to use a decorator with the same result.

So how can I optionally configure a service in order to have a loosely coupled application?


Solution

  • Like I mentioned in the comment, it is important to have a broader context for why you need to register directives (or their names).

    In absence of a broader understanding, if, generally speaking, you need to conditionally check for existence of a service (or service provider, in config), you can use the $injector:

    .config(function($injector){
       var listServiceProvider;
       if ($injector.has("listServiceProvider")) {
         listServiceProvider = $injector.get("listServiceProvider");
       }
    
       if (listServiceProvider){
         listServiceProvider.add("myDirective");
       }
    });