AngularJS:什么是工厂?


101

我已经做了很多工作Angular.js,总的来说,我发现它是一个有趣而强大的框架。

我知道关于服务,工厂,提供者,价值的讨论很多,但是我对“什么是”仍然很困惑Factory

在其他StackOverflow讨论中,工厂定义如下:

工厂工厂

语法:module.factory( 'factoryName', function );结果:在将factoryName声明为可注入参数时,将通过调用传递给module.factory的函数引用为您提供返回的值。

我发现很难理解这个解释,也并没有增加我对工厂的理解。

会有人有关于究竟什么是任何解释或现实生活中的例子份额Factory,以及为什么你应该代替使用它的ServiceProvider或者其他?

更新资料

A service 拥有对任何对象的引用

A factory 是一个返回任何对象的函数

A provider 是一个返回任何函数的函数

- -


6
我不会说这是该问题的重复,而是我在问这个问题之前先阅读了该问题,因为它的答案Factories(在上面引用)有点令人困惑。下面的一些答案Factories甚至都可以理解为某些问题
Code Whisperer

1
这个问题比“重复”的问题更具争议性,也许事情应该是相反的?
代码窃窃私语

3
链接对此进行了很好的解释。
艾哈迈德(Ahmed)2015年

Answers:


70

据我了解,它们几乎都是相同的。主要区别在于它们的复杂性。提供者可以在运行时进行配置,工厂要健壮一些,服务是最简单的形式。

看看这个问题AngularJS:服务vs提供者vs工厂

同样,这一要点可能有助于理解细微的差异。

来源:https//groups.google.com/forum/#!topic / angular / hVrkvaHGOfc

jsFiddle:http : //jsfiddle.net/pkozlowski_opensource/PxdSP/14/

作者:Pawel Kozlowski

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

//service style, probably the simplest one
myApp.service('helloWorldFromService', function() {
    this.sayHello = function() {
        return "Hello, World!";
    };
});

//factory style, more involved but more sophisticated
myApp.factory('helloWorldFromFactory', function() {
    return {
        sayHello: function() {
            return "Hello, World!";
        }
    };
});

//provider style, full blown, configurable version     
myApp.provider('helloWorld', function() {
    // In the provider function, you cannot inject any
    // service or factory. This can only be done at the
    // "$get" method.

    this.name = 'Default';

    this.$get = function() {
        var name = this.name;
        return {
            sayHello: function() {
                return "Hello, " + name + "!";
            }
        };
    };

    this.setName = function(name) {
        this.name = name;
    };
});

//hey, we can configure a provider!            
myApp.config(function(helloWorldProvider){
    helloWorldProvider.setName('World');
});


function MyCtrl($scope, helloWorld, helloWorldFromFactory, helloWorldFromService) {

    $scope.hellos = [
        helloWorld.sayHello(),
        helloWorldFromFactory.sayHello(),
        helloWorldFromService.sayHello()];
}​

因此,查看它们的一种方法是按照复杂性排序Provider > Factory > Service > Value吗?
窃窃私语者

2
那是一种查看方式,另一种方式是将Factory和Service视为Provider的抽象。如果我错了,请有人纠正我,但“工厂和服务使用提供程序”在幕后。这就是为什么提供“最接近金属”版本的原因。我相信Value是定义常量的一种方法,然后可以在整个应用程序中使用它。
乔纳森·帕卢博

18

我看到的一个主要区别是您可以在工厂中运行自定义代码。但是,在服务中,仅会创建对象。

myJs.factory('Factory', function() {

    //Write custom code here

    return {
            Hello: function() {
            return "Hello, World!"
        }
    };
});

1
您还可以在服务构造函数中运行自定义代码,不是吗?没有人在构造函数中说过,您不能运行其他代码
nonopolarity 2016年

9

我在这个问题上的两分钱。我是一个非常非常新手,只是对Angular JS的了解,这是使我感到困惑的一件事,因此我对其进行了详细的研究。我一直在做面试笔记,这可能对其他人有用。

  • 服务和工厂以不同的方式做同样的事情
  • 都是注射剂
  • 对于大多数事情,请使用工厂语法
  • 更容易理解
  • 如今使用es6完成了“服务”,因为它可以更好地转换为es6类
  • 它实质上是从控制器中抽象出业务逻辑
  • 如果您将biz逻辑与控制器一起使用,则只能与控制器一起使用
  • 控制器用于将数据放在范围内而不处理冗长的业务逻辑
  • 因此,在上述情况下发生的事情是,复杂的业务逻辑与控制器捆绑在一起。不用于处理数据。因此,将其零碎投入服务或工厂中。因此,您的代码是精益和模块化的。
  • 服务是单身人士

0

服务主要是描述对象的构造函数类的对象。在框架的某个深处,调用了Object.create()函数,然后可以通过使用控制器调用其对象和方法来使用服务。另一方面,Factory默认情况下不会创建对象,因此,定义完所有属性和方法后,您需要返回整个对象位置。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.