web-dev-qa-db-fra.com

Angularjs: un service qui dessert plusieurs URL de ressources / sources de données?

J'ai un Angular service/fournisseur qui sert des données json à mon contrôleur qui fonctionne très bien:

    angular.module('myApp.services', ['ngResource']).
      factory("statesProvider", function($resource){
      return $resource('../data/states.json', {}, {
        query: {method: 'GET', params: {}, isArray: false}
      });
    });

Mais J'ai également besoin de servir des données json au même contrôleur à partir d'un autre fichier counties.json.

Où puis-je savoir comment écrire un service qui sert les deux fichiers à mon contrôleur?

44
Henry Zhu

Vous pouvez mettre à jour le service pour renvoyer un hachage de ressources, pas un seul:

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 }
      })
    };
  });

Vous pourrez l'utiliser en ajoutant .query() à la fin de votre nom de fonction c'est-à-dire geoProvider.states.query() et geoProvider.countries.query() et myApp.services Doit être injecté dans votre contrôleur, puis injectez le service geoProvider dans le contrôleur lui-même.

94
Dmitry Evseev

Je suppose que vous voulez exécuter du code lorsque les deux fichiers sont chargés. Les promesses fonctionnent très bien pour cela. Je ne pense pas que les ressources renvoient des promesses, mais vous pouvez utiliser le service $ http pour de simples appels ajax.

Ici, je définis un service chacun pour les deux fichiers de données, et un troisième service qui renvoie une promesse qui est remplie lorsque les deux fichiers ont terminé le chargement.

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]);
});

Puis dans votre contrôleur:

statesAndCountries.then(function(data) {
    var stateData = data[0];
    var countryData = data[1];
    // do stuff with stateData and countryData here
});
9
Karen Zilles