【发布时间】:2023-03-08 22:44:01
【问题描述】:
2016 年 1 月编辑:因为这仍然引起了关注。自从提出这个问题以来,我已经完成了一些 AngularJS 项目,对于那些我主要使用 factory 的项目,构建了一个对象并在最后返回了该对象。但是,我的以下陈述仍然正确。
编辑:我想我终于明白了两者之间的主要区别,并且我有一个代码示例来演示。我也认为这个问题与建议的副本不同。副本说服务是不可实例化的,但如果你按照我在下面演示的那样设置它,它实际上是。可以将服务设置为与工厂完全相同。我还将提供代码来显示工厂故障转移服务的位置,这似乎没有其他答案。
如果我这样设置 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.speak,但是,如果我将 VaderService 更改为 module.factory,控制器中的代码将不再工作,这是主要的区别。使用工厂,注入控制器的 VaderService 没有实例化,这就是为什么在设置工厂时需要返回一个对象(请参阅问题中的示例)。
但是,您可以像设置工厂一样设置服务(IE 让它返回一个对象)并且服务的行为与工厂完全相同
鉴于这些信息,我认为没有理由使用工厂而不是服务,服务可以做工厂可以做的一切,甚至更多。
下面的原始问题。
我知道这已经被问过很多次了,但我真的看不出工厂和服务之间的任何功能差异。我读过这个教程:http://blogs.clevertech.biz/startupblog/angularjs-factory-service-provider
它似乎给出了一个相当好的解释,但是,我将我的应用程序设置如下:
index.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>
app.js:
angular.module('MyApp', [
'MyApp.services',
'MyApp.controllers'
]);
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;
});
然后,当我加载 index.html 时,我看到“加入黑暗面卢克”,太好了。完全符合预期。但是,如果我将 VaderService.js 更改为此(注意 module.service 而不是 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;
});
然后重新加载 index.html(我确保清空了缓存并进行了硬重新加载)。它的工作原理完全与使用 module.factory 时相同。那么两者之间真正的功能区别是什么?
【问题讨论】:
-
Here are some good answers 关于
services、factories和providers的工作原理。 -
您编辑的部分比这里的任何其他答案都更有意义:)
标签: javascript angularjs angularjs-service angularjs-factory