根据this source,
为什么这两种风格能够完成同样的事情? 工厂提供的灵活性略高于服务,因为它们 可以返回可以新增的功能。这跟随工厂 面向对象编程的模式。工厂可以是一个对象 用于创建其他对象。
我无法将这条信息与Javascript和object / prototype中的构造函数概念联系起来。有人可以帮我连接点吗?感谢。
答案 0 :(得分:0)
服务VS工厂
服务是一种构造函数,可以使用' new'作为工厂返回一个对象,你可以在之前运行一些代码,这就是为什么它更灵活。
要查看详细示例,请查看this问题。 matys84pl详细讨论了它。
答案 1 :(得分:0)
<强> 工厂 强>
这些实际上是单身人士。例如,您可以通过调用来保存数据。
factory('myFactory', function () {
var internalList = [];
return {
add: function (value) { internalList.push(value); },
get: function () { return internalList; }
}
});
您可以想象,如果 controller1
将Hi
推送到列表中,并立即将 controller2
推送到get()
之后,它会收到[ 'Hi' ]
。
<强> 服务 强>
JavaScript开发人员经常使用自定义类型编写面向对象的代码。
service('UnicornLauncher', function (apiToken) {
this.launchedCount = 0;
this.launch = function() {
// Make a request to the remote API and include the apiToken
...
this.launchedCount++;
}
});
<强> 提供商 强>
对于一些奖金阅读,我会告诉你一个提供者。提供商包装工厂。为什么?因为角度应用程序中有两个阶段,配置阶段和运行阶段。 服务,工厂和价值观 AREN&#39; T 在运行阶段可用。
因此,我们需要在将服务注入控制器之前配置它。我们需要使用提供商。
angular docs有一个很好的例子:
provider('unicornLauncher', function UnicornLauncherProvider() {
var useTinfoilShielding = false;
this.useTinfoilShielding = function(value) {
useTinfoilShielding = !!value;
};
this.$get = ["apiToken", function unicornLauncherFactory(apiToken) {
// let's assume that the UnicornLauncher constructor was also changed to
// accept and use the useTinfoilShielding argument
return new UnicornLauncher(apiToken, useTinfoilShielding);
}];
});
所以this.$get
基本上是factory('...', ...
的第二个参数。
因此,如果我们在配置阶段使用它,我们会这样做:
config(["unicornLauncherProvider", function(unicornLauncherProvider) {
unicornLauncherProvider.useTinfoilShielding(true);
}]);
注意我们如何要求unicornLauncherProvider
,我们添加了Provider
后缀。然而,当我们命名我们的供应商时,我们并没有提供它。这是因为angular会自动为您添加后缀。如果您要访问此提供商创建的服务,请询问unicornLauncher
。
答案 2 :(得分:0)
service
&amp;时,我有'尤里卡效应'。 factory
只是provider
的语法糖(https://docs.angularjs.org/api/auto/service/ $提供#provider)
这两者之间的唯一区别是Angular在为其提供注入器之前处理传递的值的方式。 当我从注入器中获取对象时,我通常无法判断它是使用服务还是工厂(或任何其他$ provide方法)创建的。
所以问题是“我如何实现这个?”而不是“我怎么想用这个?”。