【问题标题】:Using angular factories and services interchangeably - no error交替使用角度工厂和服务 - 没有错误
【发布时间】:2015-04-17 04:47:30
【问题描述】:

我正在使用 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>*/
   }
}

我的问题是为什么 Angular 允许您在实际返回对象时使用 .service 并且应该使用 .factory

【问题讨论】:

  • 这是一个有趣的问题

标签: javascript angularjs angularjs-service


【解决方案1】:

服务中的显式返回会覆盖默认构造函数行为。

function factory () {

    return {
        foo: 'bar'
    };

}

console.log(factory().foo); // bar

function service () {

    this.foo = 'foo';

    return {
        foo: 'bar'
    };

}

console.log(new service().foo); // bar

Fiddle

【讨论】:

  • 在看到你的答案之前就开始写我的答案,你也是对的 :) 我希望我给出的背景不是多余和混乱的。你得到了我的向上箭头。
  • 很好的答案!服务返回对象是否被认为是一种不好的做法?如果是这样,为什么?
  • 是的,从服务返回对象字面量是不好的做法。这是语义问题;服务和工厂之间的区别在于服务是由 Angular 使用new 实例化的。如果您从“服务”显式返回一个对象,那么您实际上是在创建工厂而不是服务。
【解决方案2】:

好的,这就是我对这个有趣问题的回答。

首先让我们确保我们了解服务和工厂之间的主要区别,在我们看到这两种实现之后会更容易:

工厂:

function factory(name, factoryFn) {
    return provider(name, { $get: factoryFn });
}

服务:

function service(name, constructor) {
    return factory(name, ['$injector', function($injector) {
        return $injector.instantiate(constructor);
    }]);
}

正如我们所看到的,工厂实际上正在做的是让我们得到工厂函数返回的对象。

另一方面,Service 使用我们提供的构造函数实例化一个新对象。不用说两者都是单例。

在您上面的示例中,工厂按应有的方式使用,这是最佳实践。 我想有趣的部分是为什么服务正在工作,而他的构造函数并没有真正定义一个类而是返回一个对象。

棘手的部分来了,它之所以起作用,是因为正如之前所说,使用服务实际实例化一个对象,在我们的不良做法中,我们用新的构造函数覆盖了默认构造函数。

听起来令人困惑?这是一个Fiddle,它执行基本相同的事情,我们使用 new ConstructorFunc() 而 ConstructorFunc() 而不是定义一个对象并使用 this.prop=something 创建它的属性返回一个对象。

也许这不是最佳实践,但有可能。 我认为我们最好继续按照惯例使用服务。

有趣的文章factory vs service vs provider

【讨论】:

  • 你说:It is a bad practice but it is possible. 构造函数返回一个对象。为什么角度不好?
  • 我同意说不好的做法有点苛刻,因为“工厂”和“服务”几乎相同。创建服务是通过创建工厂来执行的。无论如何,我认为这不是最佳实践,因为:首先,有一些约定可以创建一个共同点。如果开发人员过去在某些约定中工作,则更容易将代码从一个共享/移交给另一个。其次,如果工厂只是为此而制造,我认为不需要覆盖构造函数。
猜你喜欢
  • 1970-01-01
  • 2017-03-09
  • 2015-06-25
  • 2016-07-20
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多