2015-02-10 166 views
0

我需要一组资源工厂来使用rest API,并在我所有的模块和控制器中使用它。我很困惑这应该如何分开以及如何从控制器访问工厂。AngularJS在模块和控制器之间共享REST服务

举个例子,假设我有:

// 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; 
    }); 
} 

回答

3

咱们摘要问题

据我了解你想它可以在所有模块和控制器,负责消费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; 
        }); 
       } 
      };  
任何其他模块中210
+0

谢谢。在这里,您将创建'restControllerService'作为主模块'ServiceApp'的一部分。如果我在另一个叫'ServiceApp.rest'的模块中有'restControllerService',那么注入将如何改变? – norbertpy 2015-02-10 19:18:10

+0

抱歉,您的意思是“如果我在另一个模块中有restControllerService”,那么您的意思是调用该服务或定义一个具有相同名称的新服务 – 2015-02-10 19:21:08

+0

您有一个名为'ServiceApp'的模块并在该模块上定义了'restControllerService' 。但我有两个单独的模块。一个人没有服务。 – norbertpy 2015-02-10 19:27:07

2

我相信你想这样做: 对myApp - > 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的依赖关系,因为您没有在myApp.rest和ngResource中使用它们。

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

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

我不相信如何将代码分解为模块是最佳做法。就个人而言,我喜欢为整个应用程序提供一个模块,除非我试图在另一个应用程序中重用一段代码。

+0

注入必须位于模块级别或控制器级别?在你的例子中,我如何在'LibraryCtrl'中使用'Book'资源? – norbertpy 2015-02-10 19:08:38

+0

是的,在控制器级别注入Book。通常,您需要在模块级别注入模块,在控制器级别注入服务。 – restassured 2015-02-10 19:14:28

相关问题