将Angular HTTP.get函数转换为服务

时间:2012-12-18 16:28:19

标签: service angularjs

我正在尝试将HTTP.get中的Angular controllers.js函数转换为services.js中的服务。

我发现的例子都有相互矛盾的方式来实现服务,他们选择的名称令人困惑。此外,服务的实际角度文档使用的语法与所有示例的语法不同。我知道这很简单,但请帮助我。

我有app.jscontrollers.jsservices.jsfilters.js

app.js

angular.module('MyApp', []).
    config(['$routeProvider', function($routeProvider)
        {
            $routeProvider.
                when('/bookslist', {templateUrl: 'partials/bookslist.html', controller:             BooksListCtrl}).
                otherwise({redirectTo: '/bookslist'});
        }
    ]);

controllers.js

function BooksListCtrl($scope,$http) {
    $http.get('books.php?action=query').success(function(data) {
        $scope.books = data;
    });

    $scope.orderProp = 'author';
}

2 个答案:

答案 0 :(得分:121)

考虑模块和依赖注入。

所以,假设你有这三个文件

<script src="controllers.js"></script>
<script src="services.js"></script>
<script src="app.js"></script>

您需要三个模块

1。主应用模块

angular.module('MyApp', ['controllers', 'services'])
  .config(['$routeProvider', function($routeProvider){
    $routeProvider
      .when('/bookslist', {
        templateUrl: 'partials/bookslist.html', 
        controller:  "BooksListCtrl"
      })
      .otherwise({redirectTo: '/bookslist'});
  }]);

请注意,其他两个模块已注入主模块,因此它们的组件可供整个应用程序使用。

2。控制器模块

目前您的控制器是一个全局功能,您可能希望将其添加到控制器模块

angular.module('controllers',[])
  .controller('BooksListCtrl', ['$scope', 'Books', function($scope, Books){
    Books.get(function(data){
      $scope.books = data;
    });

    $scope.orderProp = 'author';
  }]);

Books传递给控制器​​功能,并由应用模块中注入的服务模块提供。

3。服务模块

您可以在此处定义Books服务。

angular.module('services', [])
  .factory('Books', ['$http', function($http){
    return{
      get: function(callback){
          $http.get('books.json').success(function(data) {
          // prepare data here
          callback(data);
        });
      }
    };
  }]);

有多种注册服务的方式。

  • service :传递构造函数(我们可以将其称为类)并返回该类的实例。
  • 提供商:最灵活和可配置的,因为它可以让您在实例化服务时访问注入器调用的函数
  • factory :在实例化服务时传递一个注入器调用的函数。

我喜欢使用factory函数,只是让它返回一个对象。在上面的示例中,我们只返回一个带有get函数的对象,该函数传递成功回调。您可以更改它以传递错误功能。


编辑在评论中回答@ yair的请求,以及如何将服务注入指令。

4。指令模块

我遵循通常的模式,首先添加js文件

<script src="directives.js"></script>

然后定义一个新模块并注册东西,在本例中是一个指令

angular.module('directives',[])
  .directive('dir', ['Books', function(Books){
    return{
      restrict: 'E',
      template: "dir directive, service: {{name}}",
      link:function(scope, element, attrs){
        scope.name = Books.name;
      }
    };
  }]);

指令模块注入app.js中的主模块

angular.module('MyApp', ['controllers', 'services', 'directives']) 

您可能希望遵循不同的策略并将模块注入指令模块

请注意,语法内联依赖项注释对于几乎所有内容都是相同的。该指令注入了相同的Books服务。

更新了Plunker http://plnkr.co/edit/mveUM6YJNKIQTbIpJHco?p=preview

答案 1 :(得分:3)

这是服务服务的实现,而不是上面提到的工厂服务。希望它有所帮助。

<强> app.js

angular.module('myApp', ['controllers', 'services'])
 .config(['$routeProvider', function($routeProvider){
    $routeProvider
      .when('/bookslist', {
        templateUrl: 'partials/bookslist.html', 
        controller:  "BooksListCtrl"
      })
      .otherwise({redirectTo: '/bookslist'});
  }]);

<强> service.js

angular.module('services', [])
  .service('books', ['$http', function($http){
      this.getData = function(onSuccess,onError){
          $http.get('books.json').then(
              onSuccess,onError);
      }  
  }]);

<强> controller.js

angular.module('controllers',[])
    .controller('BooksListCtrl', ['$scope', 'books', function($scope, books){
       $scope.submit = function(){

        $scope.books = books.getData($scope.onSuccess,$scope.onError);
       }
           $scope.onSuccess = function(data){
           console.log(data);
           $scope.bookName = data.data.bookname;
           }

           $scope.onError = function(error){
               console.log(error);
           }
  }]);