为什么使用Angular Service来收集信息,而不仅仅是$ http?

时间:2016-02-20 15:40:35

标签: javascript angularjs angularjs-service angularjs-http

两个选项,哪个更好,为什么:

示例A.

  1. app module
  2. 包含模型数据的服务
  3. 控制器从服务中调用数据
  4. 文件1:Users.js

          angular.module('users', []);
    

    文件2:userService.js

    angular.module('users').service('userService', ['$q', UserService]);
    
      function UserService($q) {
        var users = [
          {
            name: 'Bob Smith',
            age: 26,
            address: 'London',
          },
          {
            name: 'John Simpson',
            age: 41,
            address: 'New York',
          },
          {
            name: 'Maria West',
            age: 36,
            address: 'Chicago',
          }
        ];
    
        // Promise-based API
        return {
          loadAllUsers : function() {
            // Simulate async nature of real remote calls
            return $q.when(users);
          }
        };
      }
    
    })();
    

    文件3:UserController.js

              angular.module('users').controller('UserController', ['$scope', function($scope) {
    
            $scope.selected     = null;
            $scope.users        = [];
            $scope.selectUser   = selectUser;
            $scope.toggleList   = toggleUsersList;
            $scope.makeContact  = makeContact;
    
            userService
              .loadAllUsers()
              .then( function( users ) {
                $scope.users    = [].concat(users);
                $scope.selected = users[0];
              });
    }]);
    

    例B:

    1. app模块,控制器从.json文件到$ http服务绘制模型数据。
    2. json文件保存模型数据。
    3. 文件1:Users.js

            angular.module('users', []);
      
               .controller('userController', [
                  '$scope', 
                  '$http', 
                  function($scope, $http, $routeParams) {
      
                  $http.get('data.json').success(function(data) {
                  $scope.userData = data; 
                  });
      
               }]);
      

      文件2:userService.json

               [
                {
                  'name': 'Bob Smith',
                  'age': 26,
                  'address': 'London',
                },
                {
                  'name': 'John Simpson',
                  'age': 41,
                  'address': 'New York',
                },
                {
                  'name': 'Maria West',
                  'age': 36,
                  'address': 'Chicago',
                }
              ];
      
      B似乎更合乎逻辑(对我来说更容易),但是我看到人们做了A.我认为这有优势 - 任何人都可以解释它吗?

1 个答案:

答案 0 :(得分:6)

是的,A看起来更受欢迎,因为它看起来像separation of concern,遵循单一责任原则。

服务

  • 负责从后端获取数据
  • 向其他组件公开各种方法以从单个位置检索数据。

<强>控制器

  • 服务与观点之间的沟通
  • 它还处理其他视图特定的业务逻辑。

为什么方法B不好?

你在控制器本身内有简单的ajax调用。雅看起来真的很好。

但是假设你想让userData显示在另外两页上,那么你会做什么?我知道你也会在其他控制器中复制相同的代码。这里的问题出现在图片中。同样的事情将无缘无故地重复多次。正确?因此,在多个位置复制代码将在未来添加Code Maintainability问题。这就是原因,你不应该先采取行动。

接近A的方法可以更好地维护&amp;结构化代码。

修改

approach A内,您不应该对所有数据进行硬编码。它应该通过调用服务器API方法或调用.json文件从服务器检索。此外,我将写下正确的服务代码approach A,您可以在此解释结束后看到。通过查看重构代码,您可以看到我们现在已经摆脱了$q服务。因为您不需要担心自定义承诺的实现,因为$http方法确实返回promise,通过使用哪些代码可以遵循承诺链模式,使用.then

angular.module('users').service('userService', ['$http', UserService]);
  function UserService($http) {
    return {
      loadAllUsers : function() {
        // Simulate async nature of real remote calls
        return $http.get('users.json'); //return promise from herer
      }
    };
  }
})();