这个answer(和许多其他人)指出.factory和.service是提供者()功能的不同便利功能。
但是,我没有看到.service()和.factory()调用之间有任何区别(即:下面的测试通过)。有人能帮助我理解我所缺少的东西。感谢
angular.module('myMod', [])
.service('myService', function() {
return function() {return 33};
})
.factory('myFactory', function() {
return function() {return 33};
});
describe('my app tests', function() {
beforeEach(module('myMod'));
it('services should work', inject(function(myService) {
expect(myService()).to.equal(33);
}));
it('factories should work', inject(function(myFactory) {
expect(myFactory()).to.equal(33);
}));
});
答案 0 :(得分:2)
.factory
用于注册一个函数,该函数返回将作为注入的服务单例的对象的实例。
.service
用于注册一个函数,该函数将用作将作为注入服务单例的对象的构造函数。
.service
实际上使用了.factory
。来自src:
function service(name, constructor) {
return factory(name, ['$injector', function($injector) {
return $injector.instantiate(constructor);
}]);
}
换句话说,.service
注册了一个工厂函数,该函数在$injector.instantiate
注册的函数(上面称为constructor
)上调用.service
。
现在,根据您的情况,您注册的功能是:
var fn = function(){ return function(){ return 13; }; }
fn
只返回一个对象(恰好是另一个函数)。
在.factory
案例中,直接调用fn
:var svc = fn();
在.service
情况下,fn
被称为构造函数,但最终没有在this
上设置任何内容并返回一个对象(构造函数可以返回与{{1}不同的实例}) - 与上面相同的功能对象。所以,this
。
在这两种情况下,var svc = $injector.instantiate(fn)
等于函数对象:svc