I need to get some information (a schema) from the server before I set up a bunch of services that depend on that information.
My server provides a schema that defines various properties of a model. In my angular code, I have a service that gets this schema:
services.factory('schema', function($q, $http) {
var deferred = $q.defer();
$http.get('schema/').then(function(response) {
schema = // some function of response.data
deferred.resolve(schema);
}, function() {
deferred.reject('There was a problem fetching the schema');
});
return deferred.promise;
});
I would like to inject the schema object, and not the promise, into other services that depend on the schema. $routeProvider lets us do this for controllers:
app.config(function($routeProvider) {
$routeProvider.
when('/', {
controller: 'SomeCtrl',
resolve: {
schema: 'schema'
},
...
});
});
and this allows me to define SomeCtrl like this:
controllers.controller('SomeCtrl', function($scope, schema) {
// schema is an object
...
});
But for services, I have to do:
services.factory('SomeService', function(schema) {
// schema is a promise
schema.then(function(schema) {
...
});
});
Is there any way I can do this?
resolve
to resolve/reject before instantiating the controller. Then it uses local values to inject into the controller (the angular injector prefers locals). TL;DR: you're working with two differentschema
s. – Vivyan