Angularjs: Служба, которая обслуживает несколько URL-адресов ресурсов/источников данных?
У меня есть служба/провайдер Angular, который обслуживает json-данные для моего контроллера, который отлично работает:
angular.module('myApp.services', ['ngResource']).
factory("statesProvider", function($resource){
return $resource('../data/states.json', {}, {
query: {method: 'GET', params: {}, isArray: false}
});
});
Но Мне также нужно обслуживать данные json одному контроллеру из другого файла counties.json
.
Где я могу узнать, как написать службу, которая обслуживает оба файла на моем контроллере?
Ответы
Ответ 1
Вы можете обновить службу, чтобы вернуть хеш ресурсов, а не один:
angular.module('myApp.services', ['ngResource']).
factory("geoProvider", function($resource) {
return {
states: $resource('../data/states.json', {}, {
query: { method: 'GET', params: {}, isArray: false }
}),
countries: $resource('../data/countries.json', {}, {
query: { method: 'GET', params: {}, isArray: false }
})
};
});
Вы сможете использовать его, добавив .query()
в конце, ваше имя функции, т.е. geoProvider.states.query()
и geoProvider.countries.query()
и myApp.services
, должно быть введено в ваш контроллер, затем введите geoProvider
службу в сам контроллер, хорошо.
Ответ 2
Я предполагаю, что вы хотите выполнить некоторый код, когда оба файла загружены. Promises отлично работает для этого. Я не думаю, что ресурсы возвращают promises, но вы можете использовать службу $http для простых вызовов ajax.
Здесь я определяю одну службу для двух файлов данных и третий сервис, который возвращает обещание, которое выполняется, когда оба файла загружаются.
factory('states',function($http) {
return $http.get('../data/states.json');
}).
factory('countries',function($http) {
return $http.get('../data/countries.json');
}).
factory('statesAndCountries', function($q, states, countries) {
return $q.all([states, countries]);
});
Затем в вашем контроллере:
statesAndCountries.then(function(data) {
var stateData = data[0];
var countryData = data[1];
// do stuff with stateData and countryData here
});