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

AngularJS:工厂和服务?[重复]

那绪
2023-03-14

编辑2016年1月:因为这仍然得到关注。自从问了这个问题后,我已经完成了一些AngularJS项目,对于那些我主要使用工厂的项目,构建了一个对象,并在最后返回了该对象。然而,我下面的陈述仍然是正确的。

编辑:我想我终于明白了两者之间的主要区别,我有一个代码示例来演示。我亦认为这项质询与拟议的重复质询有所不同。副本中说服务是不可实例化的,但如果您按照我在下面演示的方式进行设置,它实际上是可实例化的。可以将服务设置为与工厂完全相同。我还将提供代码,显示工厂在服务上出现故障的地方,这似乎是其他答案无法做到的。

如果我这样设置VaderService(即作为服务):

var module = angular.module('MyApp.services', []);

module.service('VaderService', function() {
    this.speak = function (name) {
        return 'Join the dark side ' + name;
    }
});

然后在控制器中,我可以执行以下操作:

module.controller('StarWarsController', function($scope, VaderService) {
    $scope.luke = VaderService.speak('luke');   
});

使用服务,注入控制器的VaderService被实例化,所以我可以调用VaderService。但是,如果我将VaderService更改为module,请发言。出厂时,控制器中的代码将不再工作,这是主要区别。对于factory,注入控制器中的VaderService不会实例化,这就是为什么在设置factory时需要返回对象的原因(请参见问题中的示例)。

然而,您可以以与建立工厂完全相同的方式设置服务(IE让它返回一个对象),并且服务的行为与工厂完全相同

鉴于这些信息,我认为没有理由使用工厂而不是服务,服务可以做工厂能做的一切,甚至更多。

原始问题如下。

我知道这已经被问了很多次了,但是我真的看不出工厂和服务之间有任何功能上的区别。我读过这个教程:http://blogs.clevertech.biz/startupblog/angularjs-factory-service-provider

它似乎给出了一个相当好的解释,然而,我设置了我的应用程序如下:

指数html

<!DOCTYPE html>
<html>
    <head>
    <title>My App</title>
    <script src="lib/angular/angular.js"></script>
    <script type="text/javascript" src="js/controllers.js"></script>
    <script type="text/javascript" src="js/VaderService.js"></script>
    <script type="text/javascript" src="js/app.js"></script>
    </head>

    <body ng-app="MyApp"> 
        <table ng-controller="StarWarsController">
            <tbody>
            <tr><td>{{luke}}</td></tr>
            </tbody>
        </table>
    </body>
</html>

app.js:

angular.module('MyApp', [
  'MyApp.services',
  'MyApp.controllers'
]);

控制器。js:

var module = angular.module('MyApp.controllers', []);

module.controller('StarWarsController', function($scope, VaderService) {
    var luke = new VaderService('luke');
    $scope.luke = luke.speak();
});

维德服务。js

var module = angular.module('MyApp.services', []);

module.factory('VaderService', function() {
    var VaderClass = function(padawan) {
        this.name = padawan;
        this.speak = function () {
            return 'Join the dark side ' + this.name;
        }
    }

    return VaderClass;
});

然后当我加载索引时。html我看到“加入黑暗面卢克”,很好。一如所料。但是如果我换了维德服务。js(注意module.service而不是module.factory):

var module = angular.module('MyApp.services', []);

module.service('VaderService', function() {
    var VaderClass = function(padawan) {
        this.name = padawan;
        this.speak = function () {
            return 'Join the dark side ' + this.name;
        }
    }

    return VaderClass;
});

然后重新加载索引。html(我确保清空了缓存并进行了硬重新加载)。它的工作原理与使用模块时完全相同。工厂那么这两者之间真正的功能区别是什么呢??

共有3个答案

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

工厂和服务是最常用的食谱。它们之间的唯一区别是服务配方对自定义类型的对象更有效,而工厂可以生成JavaScript原语和函数。

参考

阎德义
2023-03-14

工厂服务只是提供商的包装。

工厂

工厂可以返回任何可以是类(构造函数)类实例字符串数字布尔值。如果返回构造函数函数,则可以在控制器中实例化。

 myApp.factory('myFactory', function () {

  // any logic here..

  // Return any thing. Here it is object
  return {
    name: 'Joe'
  }
}

服务

服务不需要返回任何内容。但是您必须分配这个变量中的所有内容。因为服务将在默认情况下创建实例并将其用作基础对象。

myApp.service('myService', function () {

  // any logic here..

  this.name = 'Joe';
}

服务背后的实际angularjs代码

function service(name, constructor) {
    return factory(name, ['$injector', function($injector) {
        return $injector.instantiate(constructor);
    }]);
}

它只是工厂的包装器。如果您从服务返回某些内容,则其行为将类似于工厂

重要信息:工厂和服务的返回结果将被缓存,所有控制器都将返回相同的结果。

我应该什么时候使用它们?

工厂在所有情况下都更可取。当您有需要在不同控制器中实例化的构造函数函数时,可以使用它。

Service是一种SingletonObject。从服务返回的对象对所有控制器都是相同的。当您想为整个应用程序拥有单个对象时,可以使用它。验证的用户详细信息。

如需进一步了解,请阅读

http://iffycan.blogspot.in/2013/05/angular-service-or-factory.html

http://viralpatel.net/blogs/angularjs-service-factory-tutorial/

闾丘文昌
2023-03-14

工厂和服务之间的区别就像函数和对象之间的区别一样

工厂供应商

>

  • 给我们函数的返回值ie。您只需创建一个对象,向其添加属性,然后返回相同的对象。当您将此服务传递到您的控制器时,对象上的这些属性现在将通过工厂在该控制器中可用。(假设情景)

    Singleton和将只创建一次

    可再用元件

    工厂是控制器之间进行通信(如共享数据)的一种很好的方式。

    可以使用其他依赖项

    通常在服务实例需要复杂的创建逻辑时使用

    无法在中注入。config()函数。

    用于不可配置的服务

    如果使用的是对象,则可以使用factory提供程序。

    语法:模块。工厂('factoryName',函数)

    服务提供商

    >

    Singleton和将只创建一次

    可再用元件

    服务用于控制器之间的通信以共享数据

    可以通过使用

    依赖项作为构造函数参数注入

    用于简单的创建逻辑

    无法在中注入。config()函数。

    如果您使用的是类,则可以使用服务提供者

    语法:module.service('serviceName',函数);

    样品演示

    在下面的示例中,我定义了MyServiceMyFactory。请注意如何在中。服务我已使用此创建了服务方法。方法名 中。factory我创建了一个factory对象,并为其指定了方法。

    安格拉斯。服务

    module.service('MyService', function() {
    
        this.method1 = function() {
                //..method1 logic
            }
    
        this.method2 = function() {
                //..method2 logic
            }
    });
    

    安格拉斯。工厂

    module.factory('MyFactory', function() {
    
        var factory = {}; 
    
        factory.method1 = function() {
                //..method1 logic
            }
    
        factory.method2 = function() {
                //..method2 logic
            }
    
        return factory;
    });
    

    再看看这些漂亮的东西

    困惑于服务还是工厂

    AngularJS工厂,服务和供应商

    ngular.js:服务vs供应商vs工厂?

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

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

    • 我对这项服务、供应商和工厂有点困惑。AngularJS模块的服务、提供者和工厂之间有什么区别?请讲述并举例说明

    • 我们如何将下面的代码转换为工厂而不是服务 在这两个方面,工厂和服务的更好实施方式是什么,请提出建议。我是AngularJs的新手,所以请帮我解决这个问题

    • 问题内容: 什么是之间的差异,并在AngularJS? 问题答案: 从AngularJS邮件列表中,我得到了一个很棒的线程,它解释了服务,工厂,提供者及其注入用法。汇编答案: 语法: 结果:在将serviceName声明为可注入参数时 ,将为您提供函数实例。 换句话说 。 工厂名称 语法: 结果:在将factoryName声明为可注入参数时,将为您提供 通过调用传递给module.factory的

    • 问题内容: 但是我仍然不知道您何时在工厂使用服务。 据我所知,工厂通常用于创建可被多个控制器调用的“通用”功能:创建通用控制器功能 Angular文档似乎更喜欢工厂而不是服务。他们甚至在使用工厂时也提到“服务”,这更加令人困惑!http://docs.angularjs.org/guide/dev_guide.services.creating_services 那么什么时候可以使用服务呢? 有什