gpt4 book ai didi

angularjs - Angular.Service 与 Angular.Factory

转载 作者:行者123 更新时间:2023-12-03 03:51:46 25 4
gpt4 key购买 nike

我都看过angular.factory()angular.service()用于声明服务;然而,我cannot find官方文档中任何地方的 angular.service

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

最佳答案

  angular.service('myService', myServiceFunction);
angular.factory('myFactory', myFactoryFunction);
<小时/>

我很难理解这个概念,直到我这样告诉自己:

服务:您编写的函数将是编辑:

  myInjectedService  <----  new myServiceFunction()

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

  myInjectedFactory  <---  myFactoryFunction()

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

例如编写一个服务函数来公开公共(public)API:

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

或者使用工厂函数来公开公共(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();

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

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();
<小时/>

使用哪一个?...

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

var myShinyNewObject = new myInjectedService.myFunction()

这可能比这更不理想:

var myShinyNewObject = new myInjectedFactory();

(但是您首先应该谨慎使用这种类型的模式,因为 Controller 中的新对象会创建难以跟踪的依赖项,这些依赖项很难模拟测试。更好让服务为您管理对象集合而不是使用 new() 狡猾地。)

<小时/>

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

还要记住,在这两种情况下,Angular 都在帮助您管理单例。无论您在何处注入(inject)服务或函数或注入(inject)多少次,您都将获得对同一对象或函数的相同引用。 (工厂只是返回数字或字符串等值时除外。在这种情况下,您将始终获得相同的值,但不是引用。)

关于angularjs - Angular.Service 与 Angular.Factory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14324451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com