angularjs – angular.service对angular.factory

前端之家收集整理的这篇文章主要介绍了angularjs – angular.service对angular.factory前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经看到 angular.factory()angular.service()用于声明服务;然而,我 cannot find 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()wily-nilly。)

还有一件事,他们都是单身人士…

还要记住,在这两种情况下,angular都帮助你管理单身。无论注入服务或函数的位置或次数,您都将获得相同的对象或函数的引用。 (除了当工厂简单地返回一个像数字或字符串一样的值时,在这种情况下,你总是得到相同的值,但不是一个引用。)

猜你在找的Angularjs相关文章