将代码从角度控制器移动到工厂的最佳方法

时间:2015-11-21 02:03:02

标签: angularjs angularjs-scope

   $http({
    'url': $scope.clientResult.resource_server_base_uri  + 'services/v6.0/agent-sessions',
    'method': 'POST',
    'headers':{'Authorization': 'bearer ' + $scope.clientResult.access_token,'content-Type': 'application/json'},
    'data': $scope.startSessionPayload
}).success(function(data) {
    $scope.data = data;
    console.log('data', $scope.data)
}).error(function(status) {
    $scope.status = status;
});

我对角度和发展总体上有点新意。对于我来说,最好的方法是将这个代码从我的控制器中移出角度并进入工厂。我觉得这会更模块化/可维护,对吧?我有点困惑,因为代码引用了当前控制器$ scope。

2 个答案:

答案 0 :(得分:0)

你提出了一个很好的问题。 AngularJS团队(缺乏)无限智慧创造了一种名为.success的可怕方法。别用那个马车的东西;请改用.then

$http返回一个承诺,使用它。

在你的工厂:

var httpPromise = $http(url);
return httpPromise;

在您的控制器中,调用承诺的.then方法。

httpPromiseFromFactory.then(function (response) {
       vm.data = response.data;
   }) .catch( function(error) {
       throw error;
   });

有关$http.success方法弃用的详细信息,请参阅最新的AngularJS $http API Docs

有关AngularJS承诺的更多信息,请参阅AngularJS $q Service API Docs

答案 1 :(得分:0)

这是我最近一直在使用的模式:

  1. AjaxService :仅处理GET调用的通用顶级AJAX服务。
  2. DataAccessService :提供POSTAjaxService请求方法的中间层服务。此服务会注入DataAccessService
  3. MyCustomService :将获得订单,客户等的业务层服务。此服务会注入app.service('AjaxService', function($http) { return { request: function(options) { return $http(options); } } });
  4. 这里是一名掠夺者:http://plnkr.co/edit/o1jUauTLQNLKx3dk6vrZ

    <强> AjaxService

    app.service('DataAccessService', ['AjaxService', function(AjaxService) {
    
      var _request = function(method, url, data) {
        var options = {
          method: method,
          url: url,
          data: data
        }
        return AjaxService.request(options);
      };
    
      return {
        get: function(url) {
          return _request('GET', url);
        },
        post: function(url, data) {
          return _request('POST', url, data);
        }
      }
    
    }]);
    

    <强> DataAccessService

    app.service('MyCustomService', function(DataAccessService) {
      return  {
        getMyData: function() {
          return DataAccessService.get('/mydata');
        },
        getMyDataPage: function(pageNumber) {
          return DataAccessService.get('/mydata/page/' + pageNumber);
        },
        saveMyData: function(myData) {
          return DataAccessService.post('/mydata', myData);
        }
      }
    })
    

    <强> MyCustomService

    {{1}}