当前位置: 首页 > 面试题库 >

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

程正阳
2023-03-14
问题内容

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

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

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

问题答案:

说明

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

第一:

  • 如果您使用服务,您将获得 一个函数的实例 (“ 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原语和函数。”



 类似资料:
  • 请容忍我在这里。我知道还有其他答案,比如:AngularJS:服务vs提供商vs工厂 然而,我仍然不知道你什么时候会使用工厂服务。 据我所知,factory通常用于创建可由多个控制器调用的“公共”函数:创建公共控制器函数 Angular的医生似乎更喜欢工厂而不是服务。他们甚至在使用工厂时提到“服务”,这更令人困惑!http://docs.angularjs.org/guide/dev_guide.

  • 我知道这已经被问了很多次了(实际上,很多!),但是我仍然不能完全理解这两者之间的主要区别是什么。 我知道一个服务返回所提供函数的一个单例实例,工厂将简单地调用该函数并返回其值。 但是... 在我看来,你可以用一个或另一个来实现相同的效果,那么我应该如何选择使用哪一个呢?为什么我应该选择服务而不是工厂,或者相反? 是否存在这样一种情况:一方可以做另一方不能做的事情?

  • 我正在探索Spring数据REST库以构建RESTAPI。 但在许多示例中,我看到RESTAPI是从Crudepository生成的。 我想知道这在生产中是否真的有用?在我看来,快速启动和运行某些东西很容易,但我宁愿将RESTAPI与“真正的”服务相结合,而不是“仅仅”与存储库相结合。 你对此有何看法? 亲切的问候B

  • 问题内容: 我试图了解Angular中工厂和服务的概念。我在控制器下有以下代码 此代码可以正常工作。但是,当我将$ http服务移入工厂时,我无法将数据返回到控制器。 使用工厂有什么好处,因为$ http即使在控制器下也可以工作 问题答案: 将服务移出控制器的目的是实现关注点分离。服务的工作是知道如何与服务器通信,而控制器的工作是在视图数据和服务器数据之间转换。 但是,您会混淆异步处理程序以及返回

  • 问题内容: 编辑2016年1月: 由于这仍然引起注意。自问了这个之后,我已经完成了一些AngularJS项目,对于我最常使用的那些项目,建立了一个对象并最后返回了该对象。但是,我下面的说法仍然正确。 编辑: 我想我终于了解了两者之间的主要区别,并且我有一个代码示例来演示。我也认为这个问题与建议的重复问题有所不同。重复项说明该服务不可实例化,但是如果您按照我在下面的演示中进行设置,它实际上是可实例化

  • 问题内容: 我对php比较陌生。有一件非常基本的事情困扰着我。我了解php用于使网站动态化。我也了解php是可用于创建动态网站的许多服务器端脚本语言之一。 但是,我不明白的是,何时需要使用index.php页面。例如,如果我的索引页面上只有一个简单的登录页面,那么它也可能只是一个简单的html页面。对?那我为什么要使它成为index.php而不是index.html? 一个示例情况的例子将是很好的