我正在尝试将HTTP.get
中的Angular controllers.js
函数转换为services.js
中的服务。
我发现的例子都有相互矛盾的方式来实现服务,他们选择的名称令人困惑。此外,服务的实际角度文档使用的语法与所有示例的语法不同。我知道这很简单,但请帮助我。
我有app.js
,controllers.js
,services.js
,filters.js
。
app.js
angular.module('MyApp', []).
config(['$routeProvider', function($routeProvider)
{
$routeProvider.
when('/bookslist', {templateUrl: 'partials/bookslist.html', controller: BooksListCtrl}).
otherwise({redirectTo: '/bookslist'});
}
]);
controllers.js
function BooksListCtrl($scope,$http) {
$http.get('books.php?action=query').success(function(data) {
$scope.books = data;
});
$scope.orderProp = 'author';
}
答案 0 :(得分:121)
考虑模块和依赖注入。
所以,假设你有这三个文件
<script src="controllers.js"></script>
<script src="services.js"></script>
<script src="app.js"></script>
您需要三个模块
angular.module('MyApp', ['controllers', 'services'])
.config(['$routeProvider', function($routeProvider){
$routeProvider
.when('/bookslist', {
templateUrl: 'partials/bookslist.html',
controller: "BooksListCtrl"
})
.otherwise({redirectTo: '/bookslist'});
}]);
请注意,其他两个模块已注入主模块,因此它们的组件可供整个应用程序使用。
目前您的控制器是一个全局功能,您可能希望将其添加到控制器模块
中angular.module('controllers',[])
.controller('BooksListCtrl', ['$scope', 'Books', function($scope, Books){
Books.get(function(data){
$scope.books = data;
});
$scope.orderProp = 'author';
}]);
Books
传递给控制器功能,并由主应用模块中注入的服务模块提供。
您可以在此处定义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);
});
}
};
}]);
有多种注册服务的方式。
我喜欢使用factory
函数,只是让它返回一个对象。在上面的示例中,我们只返回一个带有get
函数的对象,该函数传递成功回调。您可以更改它以传递错误功能。
编辑在评论中回答@ yair的请求,以及如何将服务注入指令。
我遵循通常的模式,首先添加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服务。
更新了Plunker :http://plnkr.co/edit/mveUM6YJNKIQTbIpJHco?p=preview
答案 1 :(得分:3)
这是服务服务的实现,而不是上面提到的工厂服务。希望它有所帮助。
<强> app.js 强>
angular.module('myApp', ['controllers', 'services'])
.config(['$routeProvider', function($routeProvider){
$routeProvider
.when('/bookslist', {
templateUrl: 'partials/bookslist.html',
controller: "BooksListCtrl"
})
.otherwise({redirectTo: '/bookslist'});
}]);
<强> service.js 强>
angular.module('services', [])
.service('books', ['$http', function($http){
this.getData = function(onSuccess,onError){
$http.get('books.json').then(
onSuccess,onError);
}
}]);
<强> controller.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);
}
}]);