角度服务与角度工厂
我已经看到angular.factory()和angular.service()都用于声明服务;但是,我在官方文档中找不到 angular.service
任何地方。
两种方法有什么区别?
应该使用哪个(假设他们做不同的事情)?
回答:
angular.service('myService', myServiceFunction); angular.factory('myFactory', myFactoryFunction);
直到我以这种方式对自己说:
:您编写的 函数 将是 -ed:
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()
狡猾地使用。)
还有一件事,他们都是辛格顿人…
还要记住,在两种情况下,角度都可以帮助您管理单例。无论您在何处或多少次注入服务或功能,都将获得对相同对象或功能的相同引用。(除了工厂何时仅返回数字或字符串之类的值。在这种情况下,您将始终获得相同的值,而不是引用。)
以上是 角度服务与角度工厂 的全部内容, 来源链接: utcz.com/qa/397709.html