我正在使用service
,其中应该有factory
而且我没有收到错误。
我的服务在返回构造函数时返回并返回对象。
但我的代码完美无缺。
angular.module('myApp', [])
.service('myService', myService);
function myService(/*<dependencies go in here>*/){
return {
/*<object attributes in here>*/
}
}
正确的代码应为:
angular.module('myApp', [])
.factory('myService', myService);
function myService(/*<dependencies go in here>*/){
return {
/*<object attributes in here>*/
}
}
我的问题是为什么角度允许您在实际返回对象时使用.service
并且应该使用.factory
答案 0 :(得分:4)
好这是我对这个有趣问题的回答。
首先让我们确保了解服务和工厂之间的主要区别,在看到这两种实现后会更容易:
厂:
function factory(name, factoryFn) {
return provider(name, { $get: factoryFn });
}
服务:
function service(name, constructor) {
return factory(name, ['$injector', function($injector) {
return $injector.instantiate(constructor);
}]);
}
正如我们所看到的那样,工厂实际上正在为我们提供工厂函数返回的对象。
另一方面,服务使用我们提供的构造函数实例化一个新对象。不用说两者都是单身人士。
在上面的例子中,工厂就像它应该的那样使用,这是最好的做法。 我想有趣的部分是为什么服务正在工作,而他的构造函数并没有真正定义一个类,但也返回一个对象。
这是棘手的部分,它正在工作,因为正如在使用服务之前所说的实际实例化一个对象,在我们的不良实践中,我们用新的构造函数覆盖默认构造函数。
听起来很混乱?这里有一个基本相同的Fiddle,我们使用新的ConstructorFunc()而不是定义一个对象,而是使用this.prop = something返回一个对象来创建它的属性。
也许这不是最佳做法,但有可能。 我认为我们最好继续按照惯例继续使用服务。
答案 1 :(得分:3)
服务中的显式返回会覆盖默认的构造函数行为。
function factory () {
return {
foo: 'bar'
};
}
console.log(factory().foo); // bar
function service () {
this.foo = 'foo';
return {
foo: 'bar'
};
}
console.log(new service().foo); // bar