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

23 浏览
0 Comments

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

这个问题已有答案

angular.service vs angular.factory

当一个 Angular 控制器需要调用一些逻辑,如调用 Web API,这个逻辑可以封装在 Angular 服务或工厂中。(还有其他选项,但这对于服务和工厂之间的区别并不重要。)

我刚在 Google 上搜索了一些文章和视频,解释了服务和工厂是什么。这些文章和视频没有解释应该使用哪一个和为什么。所以如果我在我的 Angular 控制器中编写代码,并且我想要使用工厂或服务,我应该使用哪一个以及为什么?

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

服务和工厂似乎都是以同样的方式使用和调用的。那么有人能解释我在哪种情况下会使用其中一种以及为什么吗?它真的很重要吗?

** 编辑 **

建议的可能答案陈述如下:

你可以使用这两个来达到同样的效果。然而,在某些情况下,工厂可以为你提供更多灵活性来创建一个带着更简单语法的可注入对象。这是因为 myInjectedService 必须总是一个对象,而 myInjectedFactory 可以是一个对象、一个函数引用或任何值。

如果是这样,那么我的问题确实得到了回答。但是如果是这样的话,知道这个是唯一的使用工厂而不是服务的原因还是挺好的。

admin 更改状态以发布 2023年5月20日
0
0 Comments

如果对象定义语法更可取,使用 factory

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

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

如果 this语法更可取,则使用service

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

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

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

与.

app.service('service', someConstructor);

service的一个好用例是,您可以将现有控制器使用controllerAs语法无缝地重构为继承自通用服务,在这种情况下,不需要替换this语句,如此处所示:

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 = '!!!';
});

0