编辑2016年1月:因为这仍然得到关注。自从问了这个问题后,我已经完成了一些AngularJS项目,对于那些我主要使用工厂
的项目,构建了一个对象,并在最后返回了该对象。然而,我下面的陈述仍然是正确的。
编辑:我想我终于明白了两者之间的主要区别,我有一个代码示例来演示。我亦认为这项质询与拟议的重复质询有所不同。副本中说服务是不可实例化的,但如果您按照我在下面演示的方式进行设置,它实际上是可实例化的。可以将服务设置为与工厂完全相同。我还将提供代码,显示工厂在服务上出现故障的地方,这似乎是其他答案无法做到的。
如果我这样设置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,请发言。出厂时,控制器中的代码将不再工作,这是主要区别。对于factory,注入控制器中的VaderService不会实例化,这就是为什么在设置factory时需要返回对象的原因(请参见问题中的示例)。
然而,您可以以与建立工厂完全相同的方式设置服务(IE让它返回一个对象),并且服务的行为与工厂完全相同
鉴于这些信息,我认为没有理由使用工厂而不是服务,服务可以做工厂能做的一切,甚至更多。
原始问题如下。
我知道这已经被问了很多次了,但是我真的看不出工厂和服务之间有任何功能上的区别。我读过这个教程: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>
app.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();
});
维德服务。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;
});
然后当我加载索引时。html我看到“加入黑暗面卢克”,很好。一如所料。但是如果我换了维德服务。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;
});
然后重新加载索引。html(我确保清空了缓存并进行了硬重新加载)。它的工作原理与使用模块时完全相同。工厂那么这两者之间真正的功能区别是什么呢??
工厂和服务是最常用的食谱。它们之间的唯一区别是服务配方对自定义类型的对象更有效,而工厂可以生成JavaScript原语和函数。
参考
工厂
和服务
只是提供商
的包装。
工厂
工厂
可以返回任何可以是类(构造函数)
,类实例
,字符串
,数字
或布尔值
。如果返回构造函数
函数,则可以在控制器中实例化。
myApp.factory('myFactory', function () {
// any logic here..
// Return any thing. Here it is object
return {
name: 'Joe'
}
}
服务
服务不需要返回任何内容。但是您必须分配这个
变量中的所有内容。因为服务将在默认情况下创建实例并将其用作基础对象。
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);
}]);
}
它只是
工厂
的包装器。如果您从服务
返回某些内容,则其行为将类似于工厂
。
重要信息
:工厂和服务的返回结果将被缓存,所有控制器都将返回相同的结果。
我应该什么时候使用它们?
工厂
在所有情况下都更可取。当您有需要在不同控制器中实例化的构造函数
函数时,可以使用它。
Object。从服务返回的对象对所有控制器都是相同的。当您想为整个应用程序拥有单个对象时,可以使用它。验证的用户详细信息。Service
是一种Singleton
如需进一步了解,请阅读
http://iffycan.blogspot.in/2013/05/angular-service-or-factory.html
http://viralpatel.net/blogs/angularjs-service-factory-tutorial/
工厂和服务之间的区别就像函数和对象之间的区别一样
工厂供应商
>
给我们函数的返回值ie。您只需创建一个对象,向其添加属性,然后返回相同的对象。当您将此服务传递到您的控制器时,对象上的这些属性现在将通过工厂在该控制器中可用。(假设情景)
Singleton和将只创建一次
可再用元件
工厂是控制器之间进行通信(如共享数据)的一种很好的方式。
可以使用其他依赖项
通常在服务实例需要复杂的创建逻辑时使用
无法在中注入。config()
函数。
用于不可配置的服务
如果使用的是对象,则可以使用factory提供程序。
语法:模块。工厂('factoryName',函数)
服务提供商
>
Singleton和将只创建一次
可再用元件
服务用于控制器之间的通信以共享数据
可以通过使用
依赖项作为构造函数参数注入
用于简单的创建逻辑
无法在
中注入。config()
函数。
如果您使用的是类,则可以使用服务提供者
语法:
module.service('serviceName',函数);
样品演示
在下面的示例中,我定义了
MyService
和MyFactory
。请注意如何在中。服务
我已使用此创建了服务方法。方法名
在中。factory
我创建了一个factory对象,并为其指定了方法。
安格拉斯。服务
module.service('MyService', function() {
this.method1 = function() {
//..method1 logic
}
this.method2 = function() {
//..method2 logic
}
});
安格拉斯。工厂
module.factory('MyFactory', function() {
var factory = {};
factory.method1 = function() {
//..method1 logic
}
factory.method2 = function() {
//..method2 logic
}
return factory;
});
再看看这些漂亮的东西
困惑于服务还是工厂
AngularJS工厂,服务和供应商
ngular.js:服务vs供应商vs工厂?
问题内容: 编辑2016年1月: 由于这仍然引起注意。自问了这个之后,我已经完成了一些AngularJS项目,对于我最常使用的那些项目,建立了一个对象并最后返回了该对象。但是,我下面的说法仍然正确。 编辑: 我想我终于了解了两者之间的主要区别,并且我有一个代码示例来演示。我也认为这个问题与建议的重复问题有所不同。重复项说明该服务不可实例化,但是如果您按照我在下面的演示中进行设置,它实际上是可实例化
问题内容: 我试图了解Angular中工厂和服务的概念。我在控制器下有以下代码 此代码可以正常工作。但是,当我将$ http服务移入工厂时,我无法将数据返回到控制器。 使用工厂有什么好处,因为$ http即使在控制器下也可以工作 问题答案: 将服务移出控制器的目的是实现关注点分离。服务的工作是知道如何与服务器通信,而控制器的工作是在视图数据和服务器数据之间转换。 但是,您会混淆异步处理程序以及返回
我对这项服务、供应商和工厂有点困惑。AngularJS模块的服务、提供者和工厂之间有什么区别?请讲述并举例说明
我们如何将下面的代码转换为工厂而不是服务 在这两个方面,工厂和服务的更好实施方式是什么,请提出建议。我是AngularJs的新手,所以请帮我解决这个问题
问题内容: 什么是之间的差异,并在AngularJS? 问题答案: 从AngularJS邮件列表中,我得到了一个很棒的线程,它解释了服务,工厂,提供者及其注入用法。汇编答案: 语法: 结果:在将serviceName声明为可注入参数时 ,将为您提供函数实例。 换句话说 。 工厂名称 语法: 结果:在将factoryName声明为可注入参数时,将为您提供 通过调用传递给module.factory的
问题内容: 但是我仍然不知道您何时在工厂使用服务。 据我所知,工厂通常用于创建可被多个控制器调用的“通用”功能:创建通用控制器功能 Angular文档似乎更喜欢工厂而不是服务。他们甚至在使用工厂时也提到“服务”,这更加令人困惑!http://docs.angularjs.org/guide/dev_guide.services.creating_services 那么什么时候可以使用服务呢? 有什