AngularJS:何时使用服务而不是工厂

2023-11-25

请耐心听我说。我知道还有其他答案,例如:AngularJS:服务、提供商、工厂

但是我仍然不知道你什么时候会使用工厂服务。

据我所知,工厂通常用于创建可由多个控制器调用的“通用”函数:创建通用控制器功能

Angular 文档似乎更喜欢工厂而不是服务。他们在使用工厂时甚至提到“服务”,这更令人困惑!http://docs.angularjs.org/guide/dev_guide.services.creating_services

那么什么时候人们会使用服务呢?

有什么事情只有通过服务才能实现或者更容易完成吗?

幕后有什么不一样的事情发生吗?性能/内存差异?

这是一个例子。除了声明方法之外,它们看起来相同,我不明白为什么我会这样做。http://jsfiddle.net/uEpkE/

Update:从托马斯的回答来看,这似乎意味着服务用于更简单的逻辑,工厂用于具有私有方法的更复杂的逻辑,所以我更新了下面的小提琴代码,似乎两者都能够支持私有函数?

myApp.factory('fooFactory', function() {
    var fooVar;
    var addHi = function(foo){ fooVar = 'Hi '+foo; }

    return {
        setFoobar: function(foo){
            addHi(foo);
        },
        getFoobar:function(){
            return fooVar;
        }
    };
});
myApp.service('fooService', function() {
    var fooVar;
    var addHi = function(foo){ fooVar = 'Hi '+foo;}

    this.setFoobar = function(foo){
        addHi(foo);
    }
    this.getFoobar = function(){
        return fooVar;
    }
});

function MyCtrl($scope, fooService, fooFactory) {
    fooFactory.setFoobar("fooFactory");
    fooService.setFoobar("fooService");
    //foobars = "Hi fooFactory, Hi fooService"
    $scope.foobars = [
        fooFactory.getFoobar(),
        fooService.getFoobar()
    ];
}

解释

你在这里得到了不同的东西:

First:

  • 如果您使用服务,您将获得函数的实例 ("this” 关键词)。
  • 如果你使用工厂你会得到返回的值 调用函数引用(工厂退货声明)。

ref: Angular.Service 与 Angular.Factory

Second:

请记住,AngularJS 中的所有提供者(值、常量、服务、工厂)都是单例!

Third:

使用其中之一(服务或工厂)与代码风格有关。 但是,一般的方法在 AngularJS 中是使用factory.

Why ?

Because “工厂方法是将对象引入 AngularJS 依赖注入系统的最常见方式。它非常灵活,可以包含复杂的创建逻辑。由于工厂是常规函数,我们还可以利用新的词法作用域来模拟“私有”变量。这非常有用,因为我们可以隐藏给定服务的实现细节。”

(ref: http://www.amazon.com/Mastering-Web-Application-Development-AngularJS/dp/1782161821).


Usage

服务 :对于共享实用函数非常有用,这些函数可通过简单地附加来调用()到注入的函数引用。也可以运行injectedArg.call(this)或类似的。

工厂 :对于返回“类”函数可能很有用,然后可以对其进行新建以创建实例。

So, 当你有复杂的逻辑时使用工厂为您服务并你不想暴露这种复杂性.

在其他情况下如果您想返回服务的实例,只需使用 service.

但随着时间的推移,你会发现我认为 80% 的情况下你都会使用工厂。

更多细节:http://blog.manishchhabra.com/2013/09/angularjs-service-vs-factory-with-example/


UPDATE :

优秀的帖子在这里:http://iffycan.blogspot.com.ar/2013/05/angular-service-or-factory.html

“如果你想要你的功能像普通函数一样被调用, use factory。如果您希望用新的函数实例化您的函数 操作员,使用服务。如果您不知道区别,请使用工厂。”


UPDATE :

AngularJS 团队做了他的工作并给出了解释:http://docs.angularjs.org/guide/providers

从这个页面:

“Factory 和 Service 是最常用的配方。它们之间的唯一区别是 Service 配方更适合自定义类型的对象,而 Factory 可以生成 JavaScript 原语和函数。”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AngularJS:何时使用服务而不是工厂 的相关文章

随机推荐

  • C++11 为什么'decltype(x)'和'decltype((x))'的类型不同?

    我发现它们是不同的 并且语言标准规定了每个语句应该检索什么样的类型 变量和表达式之间的差异 但我真的很想知道为什么这两种类型应该不同 include
  • Bash if [ -d $1] 对于空 $1 返回 true

    所以我有以下小脚本并一直想知道 bin bash if d 1 then echo foo else echo bar fi 为什么调用时会打印 foo没有参数 测试 d 对于空字符串返回 true 是怎么回事 From info core
  • 响应发送到客户端后在 Django 中执行代码

    在我的 Django 应用程序中 我想跟踪响应是否已成功发送到客户端 我很清楚 像 HTTP 这样的无连接协议中没有 无懈可击 的方式来确保客户端已收到 并显示 响应 因此这不会是关键任务功能 但我仍然想在最晚可能的时间 响应不是 HTML
  • Pycharm 社区版:“无法显示框架变量”

    每当 Pycharm 在一个使用 Flask 的项目的断点处停止时 我就会在调试窗格 替换变量 中收到此错误 我创建了一个新项目来测试这一点 本项目中断点处显示的变量 但是 由于运行配置中存在不存在的文件而导致异常断点上没有显示它们 有人对
  • 向 Apache PHP 网络服务器发送 iPhone HTTP 请求

    我是一名具有游戏和 3D 图形背景的程序员 目前我想温习我的网络和 Web 开发技能 我有一个想要完成的任务来做到这一点 我的想法是 我希望能够发送 HTTP 请求或类似于我的网络服务器的东西 该服务器运行基于 LAMP 的设置 我想知道如
  • 为什么 require mongo 给我 LoadError: no such file to load -- openssl

    我正在使用 Ubuntu Server 10 Ruby 1 9 2 当我尝试要求 mongo 时 它给了我这个错误 irb main 001 0 gt require mongo LoadError no such file to load
  • 从 python 执行 R 脚本

    我有一个 R 脚本 可以绘制一些图 我希望能够从 python 执行这个脚本 我首先尝试 import subprocess subprocess call plottingfile R shell True 这给了我以下错误 bin sh
  • 任何编程语言中的无理数表示?

    有谁知道无理数表示类型 对象 类 无论什么any编程语言 欢迎所有建议 简而言之 如果我有两个无理对象 都代表 5 的平方根 并且我将这些对象相乘 我想要返回整数 5 而不是浮点数 4 点的 9 具体来说 我需要表示能够收集术语 而不仅仅是
  • 如何记住哪个扩展 ${var%} ${var#} 从哪一端起作用? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我很难记住哪一个参数扩展 var subst or var subst 从绳子的前面取下一个 从后面取下一个 例子 var a b c echo dirname var filename
  • 在不规则网格上绘制和着色数据

    我的数据格式为 x y z 其中 x 和 y 不在常规网格上 我希望显示这些数据的 2D 颜色图 并将强度 例如灰度 映射到 z 变量 一个明显的解决方案是在规则网格上进行插值 见下文 d lt data frame x runif 1e3
  • 概括 NumPy 数组中的切片操作

    这个问题是基于this较旧的问题 给定一个数组 In 122 arr np array 1 3 7 4 9 8 arr Out 122 array 1 3 7 4 9 8 并给出其指数 In 127 np indices arr shape
  • CollapsingToolbarLayout 滚动时不起作用(折叠)

    我正在尝试创建一个CollapsingToolbarLayout在它下面是一个列表视图 当列表视图滚动时 工具栏应该折叠 但是当滚动时工具栏不折叠 它不起作用 使用了这个教程 http android developers blogspot
  • java中jar文件的热交换

    我有两个 jar 文件 其中一个 jar 包含启动进程的 main 方法 其他两个 jar 仅包含类文件 在 One jar 中 我在其清单类路径中引用了 Two jar One jar 包含使用 Class forName 动态加载类的机
  • 最快的 Java HashSet 库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 此外这个很旧的帖子 我需要一些能够使用原语并为包含大量内容的应用程序提供加速的东西HashSets of Integers Set
  • 设置 jax-ws 客户端超时

    我在设置 jax ws 超时时遇到问题 我的代码是 WebServiceClient name VoipDBJDBCService targetNamespace http db server voipmeter jextreme eu w
  • Crystal Reports 图像和 ASP.Net MVC

    当我使用使用 CrystalImageHandler aspx 的图表和图像时 我在使用 Crystal Reports 时遇到了问题 图像无法显示 我怀疑这是由于 MVC 路由问题造成的 路径图像路径类似这样 src CrystalIma
  • Symfony2/Twig - 迭代选择选项

    常用显示方式select字段是要调用的 form row form doctor service id attr class form control 我想执行两件事 检查该字段是否实际上是一个选择字段 迭代每个选项 值 名称 我知道该怎样
  • React useState setter 内的更新被调用两次

    我正在尝试更新 useState setter 范围内的内容 这正如我在以下 codepen 示例中所期望的那样 更新状态变量之外的值 但正如我的应用程序中所实现的insideCallCount每人都会被叫两次toggleCell称呼 相关
  • Google 字体无法在 Internet Explorer (IE) 11 中运行

    目前正在使用 Google Fonts 构建一个网站 一切都可以在 IE6 到 10 Firefox Chrome 和移动浏览器上运行 然而 在 IE 11 上 不会加载任何字体 并且所有内容都使用后备字体 无衬线字体等 显示 同样的问题似
  • AngularJS:何时使用服务而不是工厂

    请耐心听我说 我知道还有其他答案 例如 AngularJS 服务 提供商 工厂 但是我仍然不知道你什么时候会使用工厂服务 据我所知 工厂通常用于创建可由多个控制器调用的 通用 函数 创建通用控制器功能 Angular 文档似乎更喜欢工厂而不