AngularJS 在模块和控制器之间共享 REST 服务

AngularJS shared REST service between modules and controllers

我需要一组资源工厂来消耗剩余资源 api 并在我的所有模块和控制器中使用它。我对如何将其分开以及如何从控制器访问工厂感到困惑。

举个例子,假设我有:

// rest.js
angular.module('myApp.rest', ['ngResource'] )
    .factory('Book', function ($resource) {
        return $resource('api/book', {}, {
            getBook: {
                method: 'GET'
            },
        });
    })

这里是主模块 myApp:

 // app.js
 angular.module('myApp', [

        'ngRoute',
        'ngResource',

        'app.rest',
        'app.library'

    ])
      .config(['$routeProvider', function ($routeProvider) {
            $routeProvider.
                when('/book', {
                    templateUrl: 'someTemplate',
                    controller: 'LibraryCTRL',
                });

现在我想要另一个名为 app.library 的模块,它可以使用 Book 资源。依赖注入会是什么样子?

更重要的问题:这样做正确吗?我的意思是将整个 Book 工厂附加到 myApp 还是使用单独的 myApp.rest 模块更好?

// library.js
angular
    .module('myApp.library', ['ngResource']) // INJECT REST MODULE HERE?
    .controller('LibraryCtrl', Library);

// INJECT BOOK RESOURCE HERE? 
Library.$inject = [];

// USE BOOK IN THIS CONSTRUCTOR
function Library() {

    var vm = this;

    // USING IT
    Book.getBook(function(data){
         vm.book = data;
    });
}

我相信您正在尝试这样做: 我的应用 --> myApp.library --> myApp.rest

你已经差不多了。只需让 myApp.library 注入 myApp.rest 模块。

angular
    .module('myApp.library', ['myApp.rest'])
    .controller('LibraryCtrl', ['Book', function(Book) {
     // use Book.getBook() here.
    }]);

同时从 myApp 模块中删除 myApp.rest 和 ngResource 的依赖关系,因为您不会在那里使用它们。

angular.module('myApp', [
        'ngRoute',
        'app.library'
    ])

一般来说,只有在该模块中直接使用它时才添加依赖项。

我认为没有关于如何将代码分成模块的最佳实践。就个人而言,我喜欢整个应用程序只有一个模块,除非我试图在另一个应用程序中重用一段代码。

让我们抽象问题

据我所知,您想创建自定义工厂 "service",它可用于所有负责消耗 rest 的模块和控制器 api

所以你会 serviceModule.js

var ServiceApp = angular.module('ServiceApp', []);
ServiceApp
        .factory(
                'restControllerService',
                [
                        '$http',
                        function($http) {

                            var doRequest = 
                            function(URL) {
                                    return $http({
                                        method : 'get',
                                        url :  URL, 
                                       headers : {
                                       'Content-Type' :'application/json'
                                                 }
                                    });
                                    });
                                }

                            }
                            return {
                                getBook : function() {
                                    return doRequest('api/book');
                                }
                            };
                        } ]);

您可以像那样将其注入任何其他模块

var library = angular.module('libraryModule', [ "ServiceApp" ]);
libraryModule.controller('LibraryCtrl', [
        '$scope',
        'restControllerService',
        function($scope,restControllerService) {

            $scope.book = null;

            $scope.getbook = function() {

                    restControllerService.getbook('api/book').success(
                            function(data) {
                                $scope.book = data;
                            }).error(function() {
                        $scope.book = null;
                    });
                }
            };