我已经看到
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都帮助你管理单身。无论注入服务或函数的位置或次数,您都将获得相同的对象或函数的引用。 (除了当工厂简单地返回一个像数字或字符串一样的值时,在这种情况下,你总是得到相同的值,但不是一个引用。)