angular.service vs angular.factory

我已经看到用于声明服务的angular.factory()和angular.service(); 但是,我无法在官方文档中找到angular.service

这两种方法有什么区别? 哪些应该用于什么(假设他们做了不同的事情)?


  angular.service('myService', myServiceFunction);
  angular.factory('myFactory', myFactoryFunction);

我一直困扰着这个概念,直到我这样对自己说:

服务 :你写的功能将是新的

  myInjectedService  <----  new myServiceFunction()

工厂 :您将编写的函数(构造函数)将被调用

  myInjectedFactory  <---  myFactoryFunction()

你做什么取决于你,但有一些有用的模式...

比如编写一个服务函数来公开一个公共API:

function myServiceFunction() {
  this.awesomeApi = function(optional) {
    // calculate some stuff
    return awesomeListOfValues;
  }
}
---------------------------------------------------------------------------------
// Injected in your controller
$scope.awesome = myInjectedService.awesomeApi();

或者使用工厂函数公开一个公共API:

function myFactoryFunction() {
  var aPrivateVariable = "yay";

  function hello() {
    return "hello mars " + aPrivateVariable;
  }

  // expose a public API
  return {
    hello: hello
  };
}
---------------------------------------------------------------------------------
// Injected in your controller
$scope.hello = myInjectedFactory.hello();

或者使用工厂函数返回一个构造函数:

function myFactoryFunction() {
    return function() {
        var a = 2;
        this.a2 = function() {
            return a*2;
        };
    };
}
---------------------------------------------------------------------------------
// Injected in your controller
var myShinyNewObject = new myInjectedFactory();
$scope.four = myShinyNewObject.a2();

哪一个使用?...

你可以用两者完成同样的事情。 但是,在某些情况下,工厂为您提供更多的灵活性,以更简单的语法创建注射剂。 这是因为虽然myInjectedService必须始终是一个对象,但myInjectedFactory可以是对象,函数引用或任何值。 例如,如果您编写了一个服务来创建构造函数(如上面的最后一个示例中所示),它将不得不像下面这样实例化:

var myShinyNewObject = new myInjectedService.myFunction()

这可以说比这个更不理想:

var myShinyNewObject = new myInjectedFactory();

(但是,首先应该谨慎使用这种类型的模式,因为控制器中的新对象会创建难以模拟测试的难以跟踪的依赖关系。更好地让服务管理一组对象你比使用new()惬意。)


还有一件事,他们都是单身...

还要记住,在这两种情况下,angular都会帮助你管理一个单身人士。 无论您注入服务或功能的位置或次数如何,您都会得到与同一对象或功能相同的参考。 (除了工厂简单地返回一个数字或字符串的值之外,在这种情况下,您将始终获得相同的值,但不是参考。)


简单的说 ..

// Service
service = (a, b) => {
  a.lastName = b;
  return a;
};

// Factory
factory = (a, b) => Object.assign({}, a, { lastName: b });

const fullName = { firstName: 'john' };

// Service
const lastNameService = (a, b) => {
  a.lastName = b;
  return a;
};
console.log(lastNameService(fullName, 'doe'));

// Factory
const lastNameFactory = (a, b) => 
  Object.assign({}, a, { lastName: b })
console.log(lastNameFactory(fullName, 'doe'));

主要区别如下:

服务

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

结果:将serviceName声明为注入参数时,将为您提供传递给module.service 的函数实例

用法:对于通过简单地将( )添加到注入的函数引用来调用可用的共享实用程序函数很有用。 也可以运行injectedArg.call( this )或类似的。

工厂

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

结果:将factoryName声明为注入参数时,将提供通过调用传递给module.factory 的函数引用返回

用法:可以用于返回可用于创建实例的'class'函数。

这里是使用服务和工厂的例子。 阅读更多关于AngularJS服务与工厂的信息。

你也可以检查关于服务vs工厂的关于stackoverflow的AngularJS文档和类似的问题。

链接地址: http://www.djcxy.com/p/2185.html

上一篇: angular.service vs angular.factory

下一篇: Confused about Service vs Factory