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;
});
}
};
我需要一组资源工厂来消耗剩余资源 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;
});
}
};