问题

我看到过 angular.factory() angular.service()用于声明服务;但是,我在官方文档中的任何位置找不到 angular.service .< p>

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



解决方法
  angular.service('myService', myServiceFunction);
  angular.factory('myFactory', myFactoryFunction);

我无法围绕这个概念缠绕我的头,直到我这样把它给自己:

服务:您撰写的功能将是 -ed:

  myInjectedService  <----  new myServiceFunction()

出厂:您撰写的函数(构造函数)将调用:

  myInjectedFactory  <---  myFactoryFunction()

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

Such as writing a service function to expose a public API:

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

Or using a factory function to expose a public 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();

Or using a factory function to return a constructor:

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();

Which one to use?...

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

var myShinyNewObject = new myInjectedService.myFunction()

这可能是不太可取的比这:

var myShinyNewObject = new myInjectedFactory();

(但是你应该小心使用这种类型的模式,因为在你的控制器中的新 - 对象创建难以跟踪的依赖,很难模拟测试.让一个服务管理对象的集合比使用 new() wily-nilly.)


One more thing, they are all Singletons...

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




相关问题推荐