当前位置: 首页 > 知识库问答 >
问题:

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

薛兴德
2023-03-14

请容忍我在这里。我知道还有其他答案,比如: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()
    ];
}

共有3个答案

邓德本
2023-03-14

所有这些提供者的概念都比最初看起来简单得多。如果你解剖一个提供者,然后取出不同的部分,它就会变得非常清晰。

简单地说,这些提供者中的每一个都是另一个的专用版本,顺序如下:provider

只要提供者做了你能做的,你就可以进一步使用提供者,这将导致编写更少的代码。如果它不能实现你想要的,你可以继续下去,你只需要写更多的代码。

这张图片说明了我的意思,在这张图片中,您将看到提供程序的代码,突出显示的部分显示了提供程序的哪些部分可以用来创建工厂、值等。

更多的细节和例子,从博客文章,我得到的图像去:http://www.simplygoodcode.com/2015/11/the-difference-between-service-provider-and-factory-in-angularjs/

魏刚豪
2023-03-14

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

  • 殳睿
    2023-03-14

    这里有不同的东西:

    第一:

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

    参考:角度。服务与角度。工厂

    第二:

    请记住,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? 一个示例情况的例子将是很好的