angular.service vs angular.factory
我已经看到用于声明服务的angular.factory()和angular.service(); 但是,我无法在官方文档中找到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()
惬意。)
还有一件事,他们都是单身...
还要记住,在这两种情况下,angular都会帮助你管理一个单身人士。 无论您注入服务或功能的位置或次数如何,您都会得到与同一对象或功能相同的参考。 (除了工厂简单地返回一个数字或字符串的值之外,在这种情况下,您将始终获得相同的值,但不是参考。)
简单的说 ..
// Service
service = (a, b) => {
a.lastName = b;
return a;
};
// Factory
factory = (a, b) => Object.assign({}, a, { lastName: b });
const fullName = { firstName: 'john' };
// Service
const lastNameService = (a, b) => {
a.lastName = b;
return a;
};
console.log(lastNameService(fullName, 'doe'));
// Factory
const lastNameFactory = (a, b) =>
Object.assign({}, a, { lastName: b })
console.log(lastNameFactory(fullName, 'doe'));
主要区别如下:
服务
语法: module.service( 'serviceName', function );
结果:将serviceName声明为注入参数时,将为您提供传递给module.service
的函数的实例 。
用法:对于通过简单地将( )
添加到注入的函数引用来调用可用的共享实用程序函数很有用。 也可以运行injectedArg.call( this )
或类似的。
工厂
语法: module.factory( 'factoryName', function );
结果:将factoryName声明为注入参数时,将提供通过调用传递给module.factory
的函数引用返回的值 。
用法:可以用于返回可用于创建实例的'class'函数。
这里是使用服务和工厂的例子。 阅读更多关于AngularJS服务与工厂的信息。
你也可以检查关于服务vs工厂的关于stackoverflow的AngularJS文档和类似的问题。
链接地址: http://www.djcxy.com/p/2185.html