小编典典

AngularJS:何时使用服务而不是工厂

angularjs

但是我仍然不知道您何时在工厂使用服务。

据我所知,工厂通常用于创建可被多个控制器调用的“通用”功能:创建通用控制器功能

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()
    ];
}

阅读 233

收藏
2020-07-04

共1个答案

小编典典

说明

您在这里得到了不同的东西:

第一:

  • 如果您使用服务,您将获得 一个函数的实例 (“ this”关键字)。
  • 如果使用工厂,则将 通过调用函数引用 (工厂中的return语句)获得 返回的值

第二:

请记住,AngularJS中的所有提供程序(值,常量,服务,工厂)都是单例!

第三:

使用其中一种(服务或工厂)与代码风格有关。但是,AngularJS中的 常用方法 是使用 factory

为什么呢

因为“工厂方法是将对象放入AngularJS依赖项注入系统的最常用方法。它非常灵活并且可以包含复杂的创建逻辑。由于工厂是常规函数,因此我们还可以利用新的词法作用域来模拟”私有“变量。这非常有用,因为我们可以隐藏给定服务的实现细节。”


用法

Service:
对于共享实用程序功能很有用(),这些功能只需添加到注入的函数引用中即可调用。也可以与之injectedArg.call(this)类似地运行。

工厂: 对于返回一个“类”函数很有用,该函数可以被新创建实例。

因此, 当您 的服务中 有复杂的逻辑 并且 不想暴露这种复杂性 ,请 使用工厂

在其他情况下, 如果要返回服务实例,请使用service

但是随着时间的推移,您会发​​现在我认为的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
。如果希望使用new运算符实例化函数,请使用service。如果您不知道它们之间的区别,请使用factory。”


更新:

AngularJS小组会做他的工作并给出解释:http :
//docs.angularjs.org/guide/providers

从此页面:


Factory和Service是最常用的配方。它们之间的唯一区别是Service配方对自定义类型的对象更好,而Factory可以生成JavaScript原语和函数。”

2020-07-04