AngularJS : 工厂和服务?

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

编辑:我想我终于明白了两者之间的主要区别,我有一个代码示例要演示。我也认为这个问题与提议的副本不同。重复项说服务是不可实例化的,但是如果你像我下面演示的那样设置它,它实际上是。可以将服务设置为与工厂完全相同。我还将提供代码来显示工厂故障转移服务的位置,而其他答案似乎无法做到这一点。

如果我像这样设置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.speak,但是,如果我将VaderService更改为module.factory,控制器中的代码将不再工作,这是主要的区别。对于工厂,注入控制器的VaderService不会实例化,这就是为什么在设置工厂时需要返回对象的原因(请参阅我在问题中的示例)。

但是,您可以像设置工厂(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>

应用程序.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我看到“加入黑暗面卢克”,很棒。完全符合预期。但是,如果我将 VaderService.js更改为 this(注意 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(我确保清空缓存并进行硬重新加载)。它的工作方式与module.factory完全相同。那么两者之间真正的功能差异是什么?


答案 1

服务工厂


enter image description hereenter image description here

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

工厂提供商

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

  • 单例,并且只会创建一次

  • 可重复使用的组件

  • 工厂是控制器之间通信的好方法,例如共享数据。

  • 可以使用其他依赖项

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

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

  • 用于不可配置的服务

  • 如果您使用的是对象,则可以使用工厂提供程序。

  • 语法:module.factory('factoryName', function);

服务供应商

  • 给我们一个函数(对象)的实例 - 你刚刚用“new”关键字实例化,你将向“this”添加属性,服务将返回“this”。将服务传递到控制器时,“this”上的这些属性现在将通过服务在该控制器上可用。(假设情景)

  • 单例,并且只会创建一次

  • 可重复使用的组件

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

  • 可以使用关键字向服务对象添加属性和函数this

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

  • 用于简单的创建逻辑

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

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

  • 语法:module.service(‘serviceName’, function);

示例演示

在下面的示例中,我定义了 和 。请注意,在我使用 In 创建服务方法的过程中,我创建了一个工厂对象,并向其分配了方法。MyServiceMyFactory.servicethis.methodname..factory

AngularJS .service


module.service('MyService', function() {

    this.method1 = function() {
            //..method1 logic
        }

    this.method2 = function() {
            //..method2 logic
        }
});

AngularJS .factory


module.factory('MyFactory', function() {

    var factory = {}; 

    factory.method1 = function() {
            //..method1 logic
        }

    factory.method2 = function() {
            //..method2 logic
        }

    return factory;
});

也看看这个美丽的东西

对服务与工厂感到困惑

AngularJS Factory, Service and Provider

角度.js:服务、提供者、工厂?


答案 2

Factory并且是 .Serviceprovider

Factory可以返回任何可以是 、 、 或 的任何内容。如果返回函数,则可以在控制器中实例化。class(constructor function)instance of classstringnumberbooleanconstructor

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

  // any logic here..

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

服务

服务不需要返回任何内容。但是你必须在变量中分配所有内容。因为服务将默认创建实例并将其用作基本对象。this

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

它只是一个围绕 .如果从 返回某些内容,则其行为将类似于 。factoryserviceFactory

IMPORTANT:来自工厂和服务的返回结果将是缓存,并且对于所有控制器都将返回相同的结果。

我应该何时使用它们?

Factory在所有情况下都是可取的。当您具有需要在不同控制器中实例化的功能时,可以使用它。constructor

Service是一种对象。对于所有控制器,从服务返回的对象将相同。当您希望整个应用程序具有单个对象时,可以使用它。例如:经过身份验证的用户详细信息。Singleton

如需进一步了解,请阅读

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

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