EDIT Jan 2016:因为这仍然引起关注.自从提出这个问题以来,我已经完成了几个AngularJS项目,对于那些我主要使用factory
个的项目,我构建了一个对象,并在最后返回了该对象.然而,我下面的陈述仍然是正确的.
EDIT :我想我终于明白了两者之间的主要区别,我有一个代码示例要演示.我也认为这个问题与拟议的重复问题不同.副本显示服务不可实例化,但如果您按照我下面演示的方式设置它,它实际上是可实例化的.可以将服务设置为与工厂完全相同.我还将提供代码,显示工厂故障转移服务的位置,这似乎没有其他答案可以做到.
如果我这样设置VaderService(即作为服务):
var module = angular.module('MyApp.services', []);
module.service('VaderService', function() {
this.speak = function (name) {
return 'Join the dark side ' + name;
}
});
然后在我的控制器中,我可以这样做:
module.controller('StarWarsController', function($scope, VaderService) {
$scope.luke = VaderService.speak('luke');
});
通过服务,注入控制器的VaderService被实例化,所以我可以直接调用VaderService.但是,如果我将VaderService更改为module,请发言.工厂,the code in the controller will no longer work,这是主要的区别.对于factory,注入控制器的VaderService是not实例化的,这就是为什么在设置factory时需要返回一个对象(参见问题中的示例).
但是,您可以使用与设置工厂(即让其返回对象)和the service behaves the exact same as a factory完全相同的方式来设置服务
有了这些信息,我明白了no个使用工厂而不是服务的理由,服务可以做工厂能做的一切,甚至更多.
下面是原始问题.
我知道这已经被问了很多次了,但我真的看不出工厂和服务之间有什么功能上的区别.我读过这个教程:http://blogs.clevertech.biz/startupblog/angularjs-factory-service-provider
这似乎给出了一个相当好的解释,然而,我的应用程序设置如下:
指数html
<!DOCTYPE html>
<html>
<head>
<title>My App</title>
<script src="lib/angular/angular.js"></script>
<script type="text/javascript" src="js/controllers.js"></script>
<script type="text/javascript" src="js/VaderService.js"></script>
<script type="text/javascript" src="js/app.js"></script>
</head>
<body ng-app="MyApp">
<table ng-controller="StarWarsController">
<tbody>
<tr><td>{{luke}}</td></tr>
</tbody>
</table>
</body>
</html>
应用程序.js:
angular.module('MyApp', [
'MyApp.services',
'MyApp.controllers'
]);
控制器.js:
var module = angular.module('MyApp.controllers', []);
module.controller('StarWarsController', function($scope, VaderService) {
var luke = new VaderService('luke');
$scope.luke = luke.speak();
});
VaderService.js
var module = angular.module('MyApp.services', []);
module.factory('VaderService', function() {
var VaderClass = function(padawan) {
this.name = padawan;
this.speak = function () {
return 'Join the dark side ' + this.name;
}
}
return VaderClass;
});
Then when I load up 指数html I see "Join the dark side luke", great. Exactly as expected. However if I change VaderService.js to this (note module.service instead of module.factory):
var module = angular.module('MyApp.services', []);
module.service('VaderService', function() {
var VaderClass = function(padawan) {
this.name = padawan;
this.speak = function () {
return 'Join the dark side ' + this.name;
}
}
return VaderClass;
});
Then reload 指数html (I made sure I emptied the cache and did a hard reload). It works exactly the same as it did with module.factory. So what is the real functional difference between the two??