Angularjs:服务多个$ resource urls / data sources的服务?

时间:2013-06-18 04:52:03

标签: angularjs controller

我有一个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提供给同一个控制器。

我在哪里可以找到如何编写为我的控制器提供这两个文件的服务?

2 个答案:

答案 0 :(得分:94)

您可以更新服务以返回资源的哈希值,而不是单个哈希值:

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也为控制器本身提供服务。

答案 1 :(得分:9)

我假设你想在两个文件加载时执行一些代码。承诺对此非常有效。我认为资源不会返回承诺,但您可以使用$ 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
});