Angular:在一个服务中有多个功能

时间:2016-04-15 19:38:55

标签: angularjs service

是否可以在一个服务中拥有多个功能?

我的书服务中有这个:

(function() {
    'use strict';
    angular
            .module('app.core')
            .service('BookService', BookService);

        BookService.$inject = ['$resource'];
        /* @ngInject */
        function BookService($resource) {
            return $resource('/api/book/:id', {
                id: '@id'
            }, {
                'get': {
                    method: 'GET',
                    cache: true
                },
              'query': {
                method: 'GET',
                isArray: true,
                cache: true
            },
            });
        }
})()

但是在同一个服务中我想要另一个函数,我将传递其他参数,例如:

 return $resource('/api/book/:name', {
                name: '@name'
            }, {
                'get': {
                    method: 'GET',
                    cache: true
                },
               'query': {
                method: 'GET',
                isArray: true,
                cache: true
            },
            });

我的控制器看起来像这样,有两个不同的调用:

BookService.get({
                id: 2
            }, function(book) {})

BookService.get({
                name: "bookTitle"
            }, function(book) {})

2 个答案:

答案 0 :(得分:4)

是的,你可以。只需定义服务中的功能即可。最后,返回一个对象,该对象包含要向服务的使用者公开的所有函数。编辑:这适用于工厂。有关服务,请参阅nathan的回答。

(function() {
    'use strict';
    angular
        .module('app.core')
        .factory('BookService', BookService);

        BookService.$inject = ['$resource'];
        /* @ngInject */
        function BookService($resource) {
            var getById = function(id){
                return $resource('/api/book/:id', {
                    id: id
                }, {
                    'get': {
                        method: 'GET',
                        cache: true
                    }
                });
            };

            var getByName = function(name) {
                return $resource('/api/book/:name', {
                    name: name
                }, {
                    'get': {
                        method: 'GET',
                        cache: true
                    }
                });
            };

            return {
                getById: getById,
                getByName: getByName
            };

        }
})()

答案 1 :(得分:4)

使用服务时,您可以将功能附加到this。这样,您可以在一个服务中拥有多个功能。例如:

(function() {
'use strict';
angular
        .module('app.core')
        .service('BookService', BookService);

    BookService.$inject = ['$resource'];
    /* @ngInject */
    function BookService($resource) {
        this.fun1 = function(){
            return $resource('/api/book/:id', {
                id: '@id'
            }, {
                'get': {
                    method: 'GET',
                    cache: true
                }
            });
        }
        this.fun2 = function(){
            return $resource('/api/book/:name', {
                name: '@name'
            }, {
                'get': {
                    method: 'GET',
                    cache: true
                }
            });
        }
    })()

然后,您可以使用BookService.fun1()Bookservice.fun2()

访问这些功能

如果将函数附加到对象然后以fikkatra的方式返回该对象更有意义,那么使用工厂而不是服务。