我应该只为所有控制器使用服务吗?

时间:2018-02-03 01:25:08

标签: angularjs angularjs-service

我用angular创建了一个服务,就像:

   function dbService($http) {
            var instance = '';

            var service = {
                add: add,
                instance: instance
            };

            return service;

            function add(object) {
                return $http.post('/api/' + this.instance, object);
            }
   }

我只在每次调用服务时更改实例属性,因为我注意到每个服务都具有相同的配置,但只更改了控制器名称。有些人喜欢:

 $scope.send() = function(){
                   dbService.instance="Cars";

                   dbService.add($scope.car).then(
                   function(data){
                         console.log(data);
                   },
                  function(error){
                         console.log(error);
                   }
                 };

什么样的问题可以给我这种方法?我应该为每个控制器创建一个服务(例如" CarsService"等等),还是应该继续使用这种方法?

提前致谢!

3 个答案:

答案 0 :(得分:0)

一项服务对所有控制器都足够了。我没有任何问题地使用了以下服务。

(function() {
  'use strict';
var HttpServiceApp = angular.module('app');


var Http = function($http) {

  var HttpObject = {};

  HttpObject.get = function(route) {
    return $http.get(route)
      .then(function(response) {
        return response.data;
      });
  };

  HttpObject.post = function(route, data) {
    // console.log(data);
    return $http.post(route, data).then(function(responce) {
      // console.log("response :: " + JSON.stringify(responce));
      return responce.data;
    });
  };



  HttpObject.getParams = function(route, params) {
    var requestData = {
      method: "GET",
      url: route,
      params: params
    };

    return HttpObject.request(requestData);
  };


  HttpObject.request = function(request_data) {
    return $http(request_data).then(function(response) {
      return response.data;
    });
  };

  return HttpObject;

};

HttpServiceApp.factory('Http', ['$http', Http]);
})();

<强>控制器

$scope.send() = function(){

                   Http.post("api/Cars",$scope.car).then(
                   function(data){
                         console.log(data);
                   },
                  function(error){
                         console.log(error);
                   }
                 };

答案 1 :(得分:0)

@estus是对的。虽然我不知道具体的用例,但怀疑使用单一服务并不是最好的解决方案。

我建议看Restangular。使用此库,您可以为封装API逻辑的每个资源(端点)定义服务。 使用restangular应用于您的示例:

  • 定义资源:Cars(可以使用自定义方法扩展)
  • 将其注入需要使用它的控制器上。

通过这种方法,您的代码可以更好地与SRP匹配,并且更易读和易懂。

<强> cars.resource.js

angular.module('resources')
    .factory('Cars', CarsFactory);

function CarsFactory(Restangular, API_ENDPOINT) {
    return Restangular.withConfig(function(RestangularConfigurer) {
        RestangularConfigurer.setBaseUrl(API_ENDPOINT);

        RestangularConfigurer.extendModel('cars', function(model) {
             //Extend the resource with custom funcions
             model.getParts = function() {
                return model.getList('parts');
            };
            return model;
        });
    }).service('cars');
  }
})();

<强> controller.js

angular.module('myapp',[resources])
    .controller('MyCtrl',['$scope','Cars', MyCtrlFunction]);

function MyCtrlFunction($scope, Cars]) {
  $scope.send() = function(){
     Cars.save($scope.car).then (...)

  }
};

答案 2 :(得分:0)

该服务是单身人士;你没有单独的实例,不需要instance财产 你不需要在这里存储任何状态,所以只需使用纯函数:

function dbService($http) {

    var service = {
        add: add,
    };

    return service;

    function add(objectType, object) {
        return $http.post('/api/' + objectType, object);
    }

}