Ich muss einige Informationen (ein Schema) vom Server abrufen, bevor ich eine Reihe von Diensten einrichten, die von diesen Informationen abhängig sind.Ein gelöstes Versprechen in Dienst einfügen
Mein Server bietet ein Schema, das verschiedene Eigenschaften eines Modells definiert. In meinem Winkel Code habe ich einen Dienst, der dieses Schema wird:
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;
});
Ich möchte injizieren das Schema-Objekt und nicht das Versprechen, in andere Dienste, die auf dem Schema ab. $ RouteProvider können wir tun dies für Controller:
app.config(function($routeProvider) {
$routeProvider.
when('/', {
controller: 'SomeCtrl',
resolve: {
schema: 'schema'
},
...
});
});
und dies ermöglicht es mir SomeCtrl wie folgt zu definieren:
controllers.controller('SomeCtrl', function($scope, schema) {
// schema is an object
...
});
Aber für Dienstleistungen, ich zu tun habe:
services.factory('SomeService', function(schema) {
// schema is a promise
schema.then(function(schema) {
...
});
});
Ist Kann ich das irgendwie machen?
Nein, das ist nur, wie es funktioniert, zumindest vorerst. – aet
Der eckige Router wartet darauf, dass die Werte in 'resolve' aufgelöst/zurückgewiesen werden, bevor der Controller instanziiert wird. Dann verwendet es lokale Werte, um in den Controller zu injizieren (der Winkelinjektor bevorzugt Einheimische). TL; DR: Du arbeitest mit zwei verschiedenen Schemas. –