45

我有一个 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

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

4

2 回答 2

95

您可以更新服务以返回资源散列,而不是单个资源:

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也将服务注入控制器本身。

于 2013-06-18T07:57:36.153 回答
9

我假设您想在两个文件都加载后执行一些代码。Promise 对此非常有效。我认为资源不会返回承诺,但您可以使用 $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
});
于 2013-06-18T05:05:09.053 回答