【问题标题】:factoy vs service in angular工厂与角度服务
【发布时间】:2017-03-09 17:11:04
【问题描述】:

我有一个适用于工厂和服务的代码: 我很困惑在什么情况下我需要使用哪个代码。

这段代码使用service在console.log中输出my value

var mod = angular.module("MyModule", []);

mod.service("myService", function() {
  console.log("this is service");
    return {
      getvalue : function() {
        return "My value";
      }
  };
});

mod.controller("MyController", function(myService) {
  console.log("MyController - myFactory: " + myService.getvalue());
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="MyModule">
<div ng-controller="MyController"></div>
</div>

此代码我刚刚将mod.service() 更改为mod.factory(),其余代码相同,它在console.log 中使用factory 输出my value

var mod = angular.module("MyModule", []);

mod.service("myFactory", function() {
  console.log("this is Factory");
    return {
      getvalue : function() {
        return "My value";
      }
  };
});

mod.controller("MyController", function(myFactory) {
  console.log("MyController - myFactory: " + myFactory.getvalue());
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="MyModule">
<div ng-controller="MyController"></div>
</div>

【问题讨论】:

  • 如果函数创建并返回一个对象(服务),那么它是一个工厂,你应该使用 factory()。如果该函数是初始化this 并且不返回任何内容的构造函数,则使用service()。您实际上可以将服务与返回服务的函数一起使用,但这只是因为 JavaScript 构造函数可以做一些丑陋的事情。
  • 当我们使用工厂时,我们只是创建一个对象,为其添加属性,然后返回相同的对象。当我们将此工厂传递给控制器​​时,对象上的这些属性现在将在该控制器中可用.如果使用对象,我们可以使用工厂提供者。当我们使用 Service 时,我们只是使用“new”关键字进行实例化,您将向“this”添加属性,服务将返回“this”。当我们将服务传递给控制器​​时,“this”上的那些属性现在将在该控制器上可用。如果与类一起使用,服务会更好

标签: angularjs angular-services angular-factory


【解决方案1】:

Todd Motto 的This blog post 值得一千个回答。

使用 .factory() 为我们提供了更多的功能和灵活性,而 .service() 本质上是 .factory() 调用的“最终结果”。这 .service() 通过在函数上调用 new 给我们返回值, 这可能是限制性的,而 .factory() 是在此之前的一步 编译过程,因为我们可以选择要实现的模式和 返回。

它解释了源代码级别的区别。

在现实生活中,我的观点是使用其中一个或另一个是个人喜好问题。

来自 Java,我喜欢 .service 看起来像一个使用 this 的类。

【讨论】:

    【解决方案2】:

    让我解释一下

    服务

    服务为我们提供了一种在应用程序的生命周期内保存数据并进行通信的方法 以一致的方式跨控制器。 服务是单例对象,每个应用程序仅实例化一次(通过 $injector)并延迟加载 (仅在必要时创建)。它们提供了一个接口来将这些方法保持在一起 与特定功能相关的。

    工厂

    此服务工厂函数负责生成单个对象或函数,该对象或函数变为 此服务将在应用程序的整个生命周期中存在。当我们的 Angular 应用程序加载服务时, service 将执行此函数并将返回值保留为单例服务对象。 服务工厂函数可以是函数也可以是数组,就像我们创建的方式一样 控制器:

    所以我希望您将工厂用于您的核心操作,并从一项服务中调用该工厂(您需要为此创建一个单独的服务),这样您就可以在您的应用程序中提供更多的隔离。

    示例

    *制造一个像这样的工厂:

    app.factory('memberServiceFactory', ['$http','$filter', function ($http,$filter) {
        return {
            getData: function (data) {
                return {};
            },           
            addData: function (file, formData) {
            },
        }
    }]);
    

    *制作一项服务,例如:

    app.service('memberListService', ['memberServiceFactory', function (memberServiceFactory){
            this.getList = memberServiceFactory.getData;
            this.addMember = memberServiceFactory.addData;               
     }]);
    

    你可以在这里看到我从服务调用工厂,你可以像这样提供封装。

    【讨论】:

    • 您不是从服务中调用工厂。您正在从另一个服务调用一个服务。 factory() 和 service() 只是定义服务的两种不同方式。 Angular 注入的是服务,而不是用于创建它的工厂。此外,这似乎是来自文档或其他页面的引用,因此您应该明确说明并包含对引用材料的引用(链接)。
    • 不,我是从服务中调用工厂的,如果你能看到工厂,我只是给了服务的名称
    • 您现在可以检查一下,只是命名标准问题。
    • 不,你不是。工厂是function ($http,$filter) { ... }。这不是 memberListService 注入和调用的内容。注入和调用的是这个工厂函数创建和返回的对象:服务。
    猜你喜欢
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多