为什么工厂比AngularJS中的服务更灵活?

时间:2015-09-02 09:25:12

标签: javascript angularjs

根据this source

  

为什么这两种风格能够完成同样的事情?   工厂提供的灵活性略高于服务,因为它们   可以返回可以新增的功能。这跟随工厂   面向对象编程的模式。工厂可以是一个对象   用于创建其他对象。

我无法将这条信息与Javascript和object / prototype中的构造函数概念联系起来。有人可以帮我连接点吗?感谢。

3 个答案:

答案 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' ]

<强> 服务

来自angular docs

  

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方法)创建的。

所以问题是“我如何实现这个?”而不是“我怎么想用这个?”。