46

我正在尝试将我的 AngularHTTP.get函数转换controllers.jsservices.js.

我发现的示例都有相互冲突的实现服务的方式,并且它们的名称选择令人困惑。此外,服务的实际 Angular 文档使用的语法与所有示例不同。我知道这非常简单,但请在这里帮助我。

我有app.js, controllers.js, services.js, filters.js.

应用程序.js

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

控制器.js

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

    $scope.orderProp = 'author';
}
4

2 回答 2

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:传递一个构造函数(我们可以称它为类)并返回该类的一个实例。
  • provider:最灵活和可配置的,因为它使您可以访问注入器在实例化服务时调用的函数
  • 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 服务。

更新 Plunkerhttp ://plnkr.co/edit/mveUM6YJNKIQTbIpJHco?p=preview

于 2012-12-18T19:10:36.590 回答
3

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

应用程序.js

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

服务.js

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

控制器.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);
           }
  }]);
于 2016-07-21T19:58:12.193 回答