AngularJS - 控制器是否应该调用服务或工厂?

时间:2015-08-07 16:00:57

标签: javascript angularjs

当角度控制器需要调用某些逻辑时,比如可能调用Web API,该逻辑可以封装在角度服务或工厂中。 (还有其他选择,但这对于服务和工厂之间的差异并不重要。)

我只是做了一些谷歌搜索,那里有大量的文章和视频,解释了什么服务和工厂。这些文章和视频没有解释使用哪一个以及为什么。所以如果我在我的角度控制器中编写代码并且我想使用工厂或服务,我应该使用哪一个以及为什么?

我不关心它们是如何工作的,至少其中一个是单例,一个返回一个函数的实例,一个与new关键字一起使用,等等......

服务和工厂似乎都以相同的方式使用和调用。那么有人可以解释在哪种情况下我会使用一个而不是为什么?它甚至重要吗?

**编辑**

建议的可能答案表明:

  

你可以用两者完成同样的事情。但是,在某些情况下   工厂为您提供了更多的灵活性来创建   注入具有更简单的语法。那是因为虽然   myInjectedService必须始终是一个对象,myInjectedFactory可以   对象,函数引用或任何值。

如果就是这样,那么我的问题确实得到了解答。但是,如果情况确实如此,那就太好了。这是使用工厂而非服务的唯一原因吗?

1 个答案:

答案 0 :(得分:1)

如果优选对象定义语法,请使用factory

app.factory('factory', function () {
    ...
    return {
        value: '...'
    };
});

或者由于某种原因返回不是对象的东西。

如果service语法更合适,请使用this

app.service('service', function () {
    this.value = '...';
});

或者它应该从另一个构造函数返回一个用new创建的对象,例如

app.factory('factory', function () {
    return new someConstructor();
});

VS

app.service('service', someConstructor);

service的一个很好的用例是,您可以使用controllerAs语法无缝地重构现有控制器以继承公共服务,在这种情况下,不需要替换this语句,{{ 3}}:

app.service('parentControllerService', function () {
    this.value = '...';
});

app.controller('MainController', function (parentControllerService) {
    angular.extend(this, parentControllerService);
});

app.controller('ChildController', function (parentControllerService) {
    angular.extend(this, parentControllerService);
    this.value = '!!!';
});