Search code examples
javascriptangularjsangularjs-service

Angular JS - How to safely retain global value "extracted" using a service


I need an object to be globally accessible all throughout my Angular application, and I've gladly put this object in a value service.
Unfortunately, this object is computed by another service, and I've not been able to inject myService into same value service.

ATM, I've acheived my goal with something like this:

global service code

app.service('myService', function() {
    this.foo = function() {
        // some code that returns an object
        return computedObject
    }
})

app.run(function ($rootScope, myService) {
    $rootScope.global = {dbObject: myService.foo()}
})

And which I can use in any controller that pleases me by simply injecting $rootScope in it

However, I don't like the need of injecting the whole $rootScope wherever I need that damn object, and I trust is not much safe (or efficient?) either, since the team specifies

Of course, global state sucks and you should use $rootScope sparingly, like you would (hopefully) use with global variables in any language. In particular, don't use it for code, only data. If you're tempted to put a function on $rootScope, it's almost always better to put it in a service that can be injected where it's needed, and more easily tested.

Conversely, don't create a service whose only purpose in life is to store and return bits of data.



Do you, perchance, happens to know any way I can inject a service into a service value?

Or maybe any other Angular best practice which I could exploit?


I forgot one very important notice

The computation of the object could be quite computational intense, so I absolutely don't want it to be recomputed everytime I move from page to page, or anything else really.


Solution

  • Ideally Using $rootScope for storing a few globally required values is totally ok. But if you are still adamant on using a module, I suggest you use a provider. Make your 'myService' a provider and that will let you configure the variables in the service.

    More info here AngularJS: Service vs provider vs factory