当我使用服务函数在angularjs中定义服务时,我可以返回如下代码的对象
angular.module('myApp').service('mySerivce',function(){
return {
add: function(){};
};
});
我找不到任何关于这种编程风格的文档。
答案 0 :(得分:2)
确保您了解syntax of factory
and service
factory
:
angular.module('myApp').factory('myFactory',function(){
return {
add: function(){};
};
});
service
:
angular.module('myApp').service('myService',function(){
this.add = function () {};
});
答案 1 :(得分:0)
我建议您阅读以下Angular样式指南。
https://github.com/johnpapa/angular-styleguide
在此处添加更多详细信息(摘自样式指南)
使用new关键字实例化服务,将其用于公共方法和变量。由于这些与工厂非常相似,因此请使用工厂以保持一致性。
注意:所有Angular服务都是单例。这意味着每个进样器只有一个给定服务的实例。
// service angular .module('app') .service('logger', logger); function logger() { this.logError = function(msg) { /* */ }; } // factory angular .module('app') .factory('logger', logger); function logger() { return { logError: function(msg) { /* */ } }; } // factory angular .module('app') .factory('logger', logger); function logger() { return { logError: function(msg) { /* */ } }; }
答案 2 :(得分:0)
在角度服务中是单例,这意味着该服务只有一个实例。在某些情况下,您需要唯一的对象实例。这就是工厂模式派上用场的地方。
https://en.wikipedia.org/wiki/Factory_method_pattern
在角度内,$resource
工厂最容易看到这种模式。使用$ resource工厂,您可以请求资源的唯一实例。
在Angular服务中是类。它们是构造函数。但是只有一个实例被新建了。因此工厂允许您根据需要使用新实例。
// my service
function Foo(fooId) {
this.id = fooId;
}
function fooFactory() {
return function(id) {
return new Foo(id);
}
}
angular.module('app').factory('foo', fooFactory);
所以在上面,如果我们删除工厂并将Foo绑定到带有angular.module('app').service('foo', Foo)
的DI容器 - 会发生什么? Foo的每个实例都具有相同的id
。但是使用这个工厂,我们可以在创建实例时设置id。
那么为什么要使用工厂而不仅仅是自己新建实例?可测性。如果你在你的服务或控制器中新建你的类(是的,构造函数只是一个类,在某种意义上),那么你的代码是不可测试的。
你需要这个吗?可能不是很多。您应该只使用服务。
function Bar($http, $timeout) {
this.$http = $http;
this.$timeout = $timeout;
}
Bar.prototype.doSomething = function(value) {
return this.$http.get('/api/dosomthing', {value: value});
}
angular.module('app').service('bar', Bar);