请容忍我在这里。我知道还有其他答案,比如:AngularJS:服务vs提供商vs工厂
然而,我仍然不知道你什么时候会使用工厂服务。
据我所知,factory通常用于创建可由多个控制器调用的“公共”函数:创建公共控制器函数
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()
];
}
所有这些提供者的概念都比最初看起来简单得多。如果你解剖一个提供者,然后取出不同的部分,它就会变得非常清晰。
简单地说,这些提供者中的每一个都是另一个的专用版本,顺序如下:provider
只要提供者做了你能做的,你就可以进一步使用提供者,这将导致编写更少的代码。如果它不能实现你想要的,你可以继续下去,你只需要写更多的代码。
这张图片说明了我的意思,在这张图片中,您将看到提供程序的代码,突出显示的部分显示了提供程序的哪些部分可以用来创建工厂、值等。
更多的细节和例子,从博客文章,我得到的图像去:http://www.simplygoodcode.com/2015/11/the-difference-between-service-provider-and-factory-in-angularjs/
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;
}
});
这表明汽车服务将始终生产一辆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}编码很容易,但是您不能实例化它。
当您需要实例化一个对象时,请使用Factory,例如new Customer()、new Comment()等。
需要配置时使用提供程序。i、 e.测试url、QA url、生产url。
若你们发现你们只是在工厂里返回一个对象,你们可能应该使用这个服务。
不要这样做:
app.factory('CarFactory', function() {
return {
numCylinder: 4
};
});
改用服务:
app.service('CarService', function() {
this.numCylinder = 4;
});
这里有不同的东西:
第一:
this
”关键字)
参考:角度。服务与角度。工厂
第二:
请记住,AngularJS(价值、常量、服务、工厂)中的所有提供者都是单身者!
第三:
使用一个或另一个(服务或工厂)与代码样式有关。但是,AngularJS中常用的方法是使用工厂。
为什么?
因为“工厂方法是将对象引入AngularJS依赖注入系统的最常用方法。它非常灵活,可以包含复杂的创建逻辑。由于工厂是常规函数,我们还可以利用新的词法范围模拟“私有”“变量。这非常有用,因为我们可以隐藏给定服务的实现细节。"
(参考:http://www.amazon.com/Mastering-Web-Application-Development-AngularJS/dp/1782161821).
服务:可以通过简单地将()
附加到注入的函数引用来共享可调用的实用程序函数。也可以使用injectedArg运行。调用(此)
或类似功能。
工厂:对于返回一个“类”函数可能很有用,然后可以新建这个函数来创建实例。
因此,当您的服务中有复杂的逻辑并且不想暴露这种复杂性时,请使用工厂。
在其他情况下,如果要返回服务实例,只需使用服务即可。
但随着时间的推移,我认为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
如果希望函数像普通函数一样被调用,请使用factory。如果希望函数用新运算符实例化,请使用service。如果不知道两者的区别,请使用factory
更新:
AngularJS团队完成工作并给出解释:http://docs.angularjs.org/guide/providers
从本页:
“工厂和服务是最常用的食谱。它们之间的唯一区别是服务配方对自定义类型的对象更有效,而工厂可以生成JavaScript原语和函数。"
问题内容: 但是我仍然不知道您何时在工厂使用服务。 据我所知,工厂通常用于创建可被多个控制器调用的“通用”功能:创建通用控制器功能 Angular文档似乎更喜欢工厂而不是服务。他们甚至在使用工厂时也提到“服务”,这更加令人困惑!http://docs.angularjs.org/guide/dev_guide.services.creating_services 那么什么时候可以使用服务呢? 有什
我知道这已经被问了很多次了(实际上,很多!),但是我仍然不能完全理解这两者之间的主要区别是什么。 我知道一个服务返回所提供函数的一个单例实例,工厂将简单地调用该函数并返回其值。 但是... 在我看来,你可以用一个或另一个来实现相同的效果,那么我应该如何选择使用哪一个呢?为什么我应该选择服务而不是工厂,或者相反? 是否存在这样一种情况:一方可以做另一方不能做的事情?
我正在探索Spring数据REST库以构建RESTAPI。 但在许多示例中,我看到RESTAPI是从Crudepository生成的。 我想知道这在生产中是否真的有用?在我看来,快速启动和运行某些东西很容易,但我宁愿将RESTAPI与“真正的”服务相结合,而不是“仅仅”与存储库相结合。 你对此有何看法? 亲切的问候B
问题内容: 我试图了解Angular中工厂和服务的概念。我在控制器下有以下代码 此代码可以正常工作。但是,当我将$ http服务移入工厂时,我无法将数据返回到控制器。 使用工厂有什么好处,因为$ http即使在控制器下也可以工作 问题答案: 将服务移出控制器的目的是实现关注点分离。服务的工作是知道如何与服务器通信,而控制器的工作是在视图数据和服务器数据之间转换。 但是,您会混淆异步处理程序以及返回
问题内容: 编辑2016年1月: 由于这仍然引起注意。自问了这个之后,我已经完成了一些AngularJS项目,对于我最常使用的那些项目,建立了一个对象并最后返回了该对象。但是,我下面的说法仍然正确。 编辑: 我想我终于了解了两者之间的主要区别,并且我有一个代码示例来演示。我也认为这个问题与建议的重复问题有所不同。重复项说明该服务不可实例化,但是如果您按照我在下面的演示中进行设置,它实际上是可实例化
问题内容: 我对php比较陌生。有一件非常基本的事情困扰着我。我了解php用于使网站动态化。我也了解php是可用于创建动态网站的许多服务器端脚本语言之一。 但是,我不明白的是,何时需要使用index.php页面。例如,如果我的索引页面上只有一个简单的登录页面,那么它也可能只是一个简单的html页面。对?那我为什么要使它成为index.php而不是index.html? 一个示例情况的例子将是很好的