AngularJS在模块和控制器之间共享REST服务
我需要一组资源工厂来使用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;
});
}
咱们摘要问题
据我了解你想它可以在所有模块和控制器,负责消费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
我相信你想这样做: 对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'
])
一般来说,只有在模块中直接使用它时才会添加依赖项。
我不相信如何将代码分解为模块是最佳做法。就个人而言,我喜欢为整个应用程序提供一个模块,除非我试图在另一个应用程序中重用一段代码。
注入必须位于模块级别或控制器级别?在你的例子中,我如何在'LibraryCtrl'中使用'Book'资源? – norbertpy 2015-02-10 19:08:38
是的,在控制器级别注入Book。通常,您需要在模块级别注入模块,在控制器级别注入服务。 – restassured 2015-02-10 19:14:28
谢谢。在这里,您将创建'restControllerService'作为主模块'ServiceApp'的一部分。如果我在另一个叫'ServiceApp.rest'的模块中有'restControllerService',那么注入将如何改变? – norbertpy 2015-02-10 19:18:10
抱歉,您的意思是“如果我在另一个模块中有restControllerService”,那么您的意思是调用该服务或定义一个具有相同名称的新服务 – 2015-02-10 19:21:08
您有一个名为'ServiceApp'的模块并在该模块上定义了'restControllerService' 。但我有两个单独的模块。一个人没有服务。 – norbertpy 2015-02-10 19:27:07