【问题标题】:Building a '$resource' service for multiple API calls为多个 API 调用构建“$resource”服务
【发布时间】:2014-09-15 20:51:18
【问题描述】:

我创建了一个工厂服务,可以使用以下代码从 API 获取数据。

app.factory('Book', ['$resource','$http', function($resource, $http) {
    return $resource('http://someurl.com/api/book/', {}, {
      query: {method:'GET', isArray:false}
    });
  }]);

上面的代码用于获取数据,但我想要一个可以解析的服务,然后可以访问所有不同的 api 调用。下面是使用 $http 服务构建它的理论方法,但我无法让它工作。而且我还想拥有$resource的功能。我希望有人给我一些语法指针,我如何将每个 $resource “调用”分离到附加到服务的函数中?就像下面的 $http 服务一样。

app.service('dataService', ['$resource','$http', function($resource, $http) {    
    var urlBase = 'http://someurl.com/api/';

    this.getBooks = function () {
        return $http.get(urlBase + 'book')
    };

    this.getArticles = function () {
        return $http.get(urlBase + 'articles');
    };
}]);

【问题讨论】:

  • 你不能把$http.get(urlBase + 'book')换成$resource(urlBase + 'book').get();

标签: angularjs angularjs-service angularjs-resource angularjs-http


【解决方案1】:

Goodzilla 的上述解决方案有效 - 但我最终使用了Gustav 的解决方案

app.service('dataService', ['$resource', function($resource) {
    var urlBase = 'http://someurl.com/api/';

    this.getBooks = function () {
        return $resource(urlBase + 'Books').get();
    };

    this.getArticles = function () {
        return $resource(urlBase + 'Articles').get();
    };

}]);

还有控制器

app.controller('MyCtrl', ['$scope', 'dataService', function($scope, DataService) {
    $scope.logBook = DataService.getBooks();
}]);

【讨论】:

    【解决方案2】:

    编辑以反映您的需求。不过没试过运行它。

    app.factory('DataService', ['$resource',
        function($resource) {
            return $resource('http://someurl.com/api/:path', {
                path: '@path'
            }, {
                getBook: {
                    method: 'GET',
                    params: {
                        path: 'book'
                    }
                }
            }, {
                getArticles: {
                    method: 'GET',
                    params: {
                        path: 'articles'
                    },
                    isArray: true
                }
            });
        }
    ])
    

    然后在你的控制器中,用正确的路径调用资源服务:

    this.getBook = function() {
        $scope.book = DataService.getBook({}, function success() {
            //your code
        }, function err() {
            //your code
        });
    };
    
    this.getArticles = function() {
        $scope.articles = DataService.getArticles({}, function success() {
            //your code
        }, function err() {
            //your code
        });
    };
    

    【讨论】:

    • 几乎,我希望有相反的逻辑 - 这样我的路径就在服务中定义,允许我在控制器中调用 DataService.getBooks();DataService.getArticles();
    • 我们如何将不同数量的参数传递给同一个资源 url,这可能吗?
    猜你喜欢
    • 2014-08-18
    • 2014-08-19
    • 2016-02-15
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 2018-06-25
    相关资源
    最近更新 更多