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');
});
使用service,注入到控制器的VaderService被实例化,所以我可以调用VaderService.speak,但是,如果我将VaderService更改为module.factory,控制器中的代码将不再工作< / em>,这是主要的区别。对于工厂,注入控制器的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相同。那么两者之间真正的功能区别是什么?
答案 0 :(得分:282)
工厂和服务之间的区别就像函数和对象之间的区别
工厂提供商
给我们函数的返回值即。您只需创建一个对象,向其添加属性,然后返回相同的对象。当您将此服务传递到控制器时,该对象上的这些属性现在将通过您的工厂在该控制器中可用。 (假设情景)
单身人士,只会创建一次
可重复使用的组件
工厂是在共享数据等控制器之间进行通信的绝佳方式。
可以使用其他依赖项
通常在服务实例需要复杂的创建逻辑时使用
无法在.config()
函数中注入。
用于不可配置的服务
如果您正在使用对象,则可以使用工厂提供程序。
语法:module.factory('factoryName', function);
服务提供商
为我们提供一个函数(对象)的实例 - 您只需使用'new'关键字进行实例化,然后您将向'this'添加属性,服务将返回'this'。当您传递服务时在您的控制器中,“this”上的这些属性现在可以通过您的服务在该控制器上使用。 (假设情景)
单身人士,只会创建一次
可重复使用的组件
服务用于控制器之间的通信以共享数据
您可以使用this
关键字
依赖项作为构造函数参数注入
用于简单的创建逻辑
无法在.config()
函数中注入。
如果您正在使用课程,则可以使用服务提供商
语法:module.service(‘serviceName’, function);
在下面的示例中,我定义了MyService
和MyFactory
。请注意.service
如何使用this.methodname.
创建服务方法在.factory
中我创建了一个工厂对象并为其分配了方法。
AngularJS .service
module.service('MyService', function() {
this.method1 = function() {
//..method1 logic
}
this.method2 = function() {
//..method2 logic
}
});
AngularJS .factory
module.factory('MyFactory', function() {
var factory = {};
factory.method1 = function() {
//..method1 logic
}
factory.method2 = function() {
//..method2 logic
}
return factory;
});
另外看看这些美丽的东西
<强> Confused about service vs factory 强>
答案 1 :(得分:41)
Factory
和Service
只是provider
的包装。
<强>工厂强>
Factory
可以返回任何可以是class(constructor function)
,instance of class
,string
,number
或boolean
的内容。如果返回constructor
函数,则可以在控制器中实例化。
myApp.factory('myFactory', function () {
// any logic here..
// Return any thing. Here it is object
return {
name: 'Joe'
}
}
<强>服务强>
服务不需要返回任何内容。但是你必须在this
变量中分配所有内容。因为服务将默认创建实例并将其用作基础对象。
myApp.service('myService', function () {
// any logic here..
this.name = 'Joe';
}
服务背后的实际angularjs代码
function service(name, constructor) {
return factory(name, ['$injector', function($injector) {
return $injector.instantiate(constructor);
}]);
}
它只是factory
的包装器。如果您从service
返回某些内容,则其行为将类似于Factory
。
IMPORTANT
:Factory和Service的返回结果将是缓存,并且将为所有控制器返回相同的结果。
我什么时候应该使用它们?
在所有情况下, Factory
最为可取。当你有constructor
函数需要在不同的控制器中实例化时,可以使用它。
Service
是一种Singleton
对象。对于所有控制器,从服务返回的对象将是相同的。当您想要为整个应用程序使用单个对象时,可以使用它。
例如:经过身份验证的用户详细信息。
如需进一步了解,请阅读
http://iffycan.blogspot.in/2013/05/angular-service-or-factory.html
http://viralpatel.net/blogs/angularjs-service-factory-tutorial/
答案 2 :(得分:7)
工厂和服务是最常用的食谱。它们之间的唯一区别是Service配方对自定义类型的对象更有效,而Factory可以生成JavaScript原语和函数。
答案 3 :(得分:4)
它们在技术上是相同的,它实际上是使用$provide
service的provider
函数的另一种表示法。
service
和factory
表示法之间仅的区别在于该服务是 new-ed 而工厂不是。但对于其他一切,他们看,嗅觉和行为相同。同样,它只是 $ provide.provider 函数的简写。
// Factory
angular.module('myApp').factory('myFactory', function() {
var _myPrivateValue = 123;
return {
privateValue: function() { return _myPrivateValue; }
};
});
// Service
function MyService() {
this._myPrivateValue = 123;
}
MyService.prototype.privateValue = function() {
return this._myPrivateValue;
};
angular.module('myApp').service('MyService', MyService);