Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Angular : Have multiple functions in one Service

Is it possible to have multiple functions in one service ?

I have this in my book 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
            },
            });
        }
})()

But in the same service i want to have another function where i will pass other parameters, ex :

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

My controller looks like this and has two differents calls:

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

BookService.get({
                name: "bookTitle"
            }, function(book) {})
like image 224
user708683 Avatar asked Apr 15 '16 19:04

user708683


2 Answers

Yes you can. Just define the functions within the service. At the end, return an object that contains all the functions you want to expose to the consumers of the service. Edit: this works for factories. For services, see nathan's answer.

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

        }
})()
like image 66
fikkatra Avatar answered Sep 21 '22 21:09

fikkatra


When using a service you can attach functions to this. In that way you can have multiple functions in one service. for example:

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

You can then access the functions with BookService.fun1() and Bookservice.fun2()

If attaching the functions to an object and then returning that object in the way that fikkatra did makes more sense, then use a factory instead of a service.

like image 37
nathan.medz Avatar answered Sep 22 '22 21:09

nathan.medz