当角度控制器需要调用某些逻辑时,比如可能调用Web API,该逻辑可以封装在角度服务或工厂中。 (还有其他选择,但这对于服务和工厂之间的差异并不重要。)
我只是做了一些谷歌搜索,那里有大量的文章和视频,解释了什么服务和工厂。这些文章和视频没有解释使用哪一个以及为什么。所以如果我在我的角度控制器中编写代码并且我想使用工厂或服务,我应该使用哪一个以及为什么?
我不关心它们是如何工作的,至少其中一个是单例,一个返回一个函数的实例,一个与new关键字一起使用,等等......
服务和工厂似乎都以相同的方式使用和调用。那么有人可以解释在哪种情况下我会使用一个而不是为什么?它甚至重要吗?
**编辑**
建议的可能答案表明:
你可以用两者完成同样的事情。但是,在某些情况下 工厂为您提供了更多的灵活性来创建 注入具有更简单的语法。那是因为虽然 myInjectedService必须始终是一个对象,myInjectedFactory可以 对象,函数引用或任何值。
如果就是这样,那么我的问题确实得到了解答。但是,如果情况确实如此,那就太好了。这是使用工厂而非服务的唯一原因吗?
答案 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 = '!!!';
});