Введение решенного обещания в сервис
Мне нужно получить некоторую информацию (схему) с сервера, прежде чем я настрою группу сервисов, которые зависят от этой информации.
Мой сервер предоставляет схему, которая определяет различные свойства модели. В моем угловом коде у меня есть сервис, который получает эту схему:
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;
});
Я хотел бы внедрить объект схемы, а не обещание, в другие службы, которые зависят от схемы. $routeProvider позволяет нам сделать это для контроллеров:
app.config(function($routeProvider) {
$routeProvider.
when('/', {
controller: 'SomeCtrl',
resolve: {
schema: 'schema'
},
...
});
});
и это позволяет мне определить SomeCtrl следующим образом:
controllers.controller('SomeCtrl', function($scope, schema) {
// schema is an object
...
});
Но для услуг я должен сделать:
services.factory('SomeService', function(schema) {
// schema is a promise
schema.then(function(schema) {
...
});
});
Есть ли способ, которым я могу сделать это?
2 ответа
То, что вы хотите, это отложенный начальный загрузчик. Для этого уже создан плагин - https://github.com/philippd/angular-deferred-bootstrap.
Я создаю пример на plunkr - http://plnkr.co/edit/VfISHNULXRLe52NeAsn1?p=preview
* Вы должны заменить существующее приложение ng на отложенную загрузку
Фрагмент кода -
angular.element(document).ready(function() {
deferredBootstrapper.bootstrap({
element: document.body,
module: 'plunker',
resolve: {
schema: ['$http',
function($http) {
return $http.get('schema.json');
}
]
}
});
});
Затем вы можете использовать схему в любом случае в контроллере, службах или на фабрике, как при разрешении маршрута.
Образец кода для фабрики
app.factory('SomeService', function(schema){
return {
getTitle: function() {
return schema.title;
}
}
});
Вы получаете обещание, потому что ваша сервисная функция сразу же оценивает его тело при вызове (как это делают функции). Обычно служба должна возвращать объект, чтобы потребитель (другая служба, контроллер и т. Д.) Мог затем вызывать функции этого объекта, когда это необходимо.
services.factory('schema', function($q, $http) {
return {
get: function() {
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;
}
}
});