AngularJS:何时使用服务而不是工厂
请在这里忍受我。 我知道还有其他答案,如:AngularJS:服务vs提供者vs工厂
但是我仍然无法弄清楚什么时候使用服务而不是工厂。
从我所知道的工厂通常用于创建可由多个控制器调用的“通用”功能:创建通用控制器功能
Angular文档似乎更喜欢工厂服务。 他们甚至在使用更加混乱的工厂时提到“服务”! http://docs.angularjs.org/guide/dev_guide.services.creating_services
那么,什么时候会使用服务?
有没有什么东西只能通过服务完成或者更容易完成?
幕后有什么不同吗? 性能/内存差异?
这是一个例子。 除了声明的方法之外,它们看起来是相同的,我无法弄清楚为什么我会做一个和另一个。 http://jsfiddle.net/uEpkE/
更新:从托马斯的答案,它似乎暗示服务是更简单的逻辑和工厂更复杂的逻辑与私人方法,所以我更新了下面的小提琴代码,似乎都能够支持私人功能?
myApp.factory('fooFactory', function() {
var fooVar;
var addHi = function(foo){ fooVar = 'Hi '+foo; }
return {
setFoobar: function(foo){
addHi(foo);
},
getFoobar:function(){
return fooVar;
}
};
});
myApp.service('fooService', function() {
var fooVar;
var addHi = function(foo){ fooVar = 'Hi '+foo;}
this.setFoobar = function(foo){
addHi(foo);
}
this.getFoobar = function(){
return fooVar;
}
});
function MyCtrl($scope, fooService, fooFactory) {
fooFactory.setFoobar("fooFactory");
fooService.setFoobar("fooService");
//foobars = "Hi fooFactory, Hi fooService"
$scope.foobars = [
fooFactory.getFoobar(),
fooService.getFoobar()
];
}
说明
你在这里得到不同的东西:
第一:
this
”关键字)。 ref:angular.service vs angular.factory
第二:
请记住,AngularJS中的所有提供者(价值,常量,服务,工厂)都是单身人士!
第三:
使用其中一种(服务或工厂)是关于代码风格的。 但是,AngularJS的常见方式是使用工厂 。
为什么?
因为 “工厂方法是将对象转化为AngularJS依赖注入系统的最常用方式,它非常灵活并且可以包含复杂的创建逻辑,由于工厂是常规函数,我们还可以利用新的词法范围来模拟”私有“变量,这是非常有用的,因为我们可以隐藏给定服务的实现细节。”
(参考:http://www.amazon.com/Mastering-Web-Application-Development-AngularJS/dp/1782161821)。
用法
服务:可以用于共享通过简单地追加()
到注入的函数引用来调用的实用程序函数。 也可以运行injectedArg.call(this)
或类似的。
工厂:可以用于返回一个'新'类的'类'函数来创建实例。
所以, 当你的服务中有复杂的逻辑时 ,请使用工厂,而你不想暴露这种复杂性 。
在其他情况下, 如果你想返回一个服务的实例,只需使用服务 。
但是随着时间的推移,你会发现在80%的案例中我会使用工厂。
欲了解更多详情,请访问:http://blog.manishchhabra.com/2013/09/angularjs-service-vs-factory-with-example/
更新:
优秀的帖子在这里:http://iffycan.blogspot.com.ar/2013/05/angular-service-or-factory.html
“如果你希望你的函数像普通函数一样被调用 ,那么使用工厂 ,如果你希望你的函数被新的操作符实例化,请使用service,如果你不知道它们的区别,请使用factory。
更新:
AngularJS团队完成他的工作并给出解释:http://docs.angularjs.org/guide/providers
并从此页面:
“工厂和服务是最常用的配方,它们唯一的区别是服务配方对自定义类型的对象更好,而工厂可以生成JavaScript原语和函数。”
allernhwkim最初在这个问题上发布了一个关于链接到他的博客的答案,但是一个版主删除了它。 这是我发现的唯一一篇不仅告诉你如何与服务,提供商和工厂一起做同样的事情,而且还告诉你可以用一个你不能在工厂工作的提供者做什么,一个你不能提供服务的工厂。
直接从他的博客:
app.service('CarService', function() {
this.dealer="Bad";
this.numCylinder = 4;
});
app.factory('CarFactory', function() {
return function(numCylinder) {
this.dealer="Bad";
this.numCylinder = numCylinder
};
});
app.provider('CarProvider', function() {
this.dealerName = 'Bad';
this.$get = function() {
return function(numCylinder) {
this.numCylinder = numCylinder;
this.dealer = this.dealerName;
}
};
this.setDealerName = function(str) {
this.dealerName = str;
}
});
这显示了CarService将如何生产一款带有4个气缸的汽车,您无法为个别汽车改变它。 鉴于CarFactory返回一个函数,所以你可以在你的控制器中做一个new CarFactory
,传入特定于该汽车的多个气瓶。 你不能做new CarService
因为CarService是一个对象而不是函数。
工厂不这样工作的原因是:
app.factory('CarFactory', function(numCylinder) {
this.dealer="Bad";
this.numCylinder = numCylinder
});
并自动返回一个函数供你实例化,是因为你无法做到这一点(把东西添加到原型/ etc):
app.factory('CarFactory', function() {
function Car(numCylinder) {
this.dealer="Bad";
this.numCylinder = numCylinder
};
Car.prototype.breakCylinder = function() {
this.numCylinder -= 1;
};
return Car;
});
看看它是如何从字面上生产汽车的工厂。
他博客的结论非常好:
结论是,
---------------------------------------------------
| Provider| Singleton| Instantiable | Configurable|
---------------------------------------------------
| Factory | Yes | Yes | No |
---------------------------------------------------
| Service | Yes | No | No |
---------------------------------------------------
| Provider| Yes | Yes | Yes |
---------------------------------------------------
当你只需要一个简单的对象如Hash时使用Service,例如{foo; 1,bar:2}这很容易编码,但是你不能实例化它。
当你需要实例化一个对象时,使用工厂,例如新的Customer(),新的Comment()等等。
在需要配置时使用Provider。 即测试网址,质量保证网址,制作网址。
如果你发现你只是在工厂返回一个对象,你应该使用服务。
不要这样做:
app.factory('CarFactory', function() {
return {
numCylinder: 4
};
});
改为使用服务:
app.service('CarService', function() {
this.numCylinder = 4;
});
所有这些供应商的概念比最初出现的要简单得多。 如果你解剖一个提供者,并且拉出不同的部分,它就变得非常清楚。
简单地说,这些提供者中的每一个都是另一个提供者的专用版本,按以下顺序: provider
> factory
> value
/ constant
/ service
。
只要提供者做了你所能做的事情,你就可以使用提供者进一步向下链接,这会导致编写更少的代码。 如果它没有达到你想要的,你可以上链,你只需要编写更多的代码。
这张图片说明了我的意思,在这张图片中,您将看到供应商的代码,突出显示的部分显示供应商的哪些部分可用于创建工厂,价值等。
AngularJS提供商,工厂,服务等都是一样的事情http://www.simplygoodcode.com/wp-content/uploads/2015/11/angularjs-provider-service-factory-highlight.png
欲了解更多详情和博客文章中的示例,请点击:http://www.simplygoodcode.com/2015/11/the-difference-between-service-provider-and-factory-in-angularjs/
链接地址: http://www.djcxy.com/p/2173.html