I've been tinkering with AngularJS and I've built up a small collection of directives and services that I would like to package into a single JS file so that I can use them anywhere.
I have some website specific settings that my module will need for API calls and that sort of thing. I'm just wondering what the Angular way of making configurable modules is. Obviously I don't want to have to modify my reusable JS file for each website, as that kind of defeats the purpose of having it. Seeing as the values are going to remain the same for each website it seems like an awful lot of hassle to pass them in as an argument on each function call, and I'd rather stay away from global variables as much as possible.
I've searched a lot of questions for the answers I seek, and the closest pattern I've found so far is to have my reusable module be dependant on a not included module called "settings" or something and then define that module in the page's JS file, allowing the reusable module to pull the values from it. Here's an example to show what I mean.
This seems backwards to me. It's kind of like having a function pull values from global values instead of passing the values in as arguments.
Is this really the best way of doing this, or is there an alternative?
It sounds like you're looking for a provider.
Here's a very basic example of a provider:
This creates a new service, just like you might with
myMod.service
ormyMod.factory
, but provides an additional API that is available at config time—namely, asetText
method. You can get access to the provider inconfig
blocks:Now, when we inject the
greeting
service, Angular will call the provider's$get
method (injecting any services it asks for in its parameters) and gives you whatever it returns; in this case,$get
returns a function that, when called with a name, will alert the name with whatever we've set withsetText
:This is exactly how other providers, like
$httpProvider
and$routeProvider
work.For more information on providers and dependency injection in general, check out this SO question on dependency injection.