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:何时使用服务而不是工厂 的相关文章

  • ng-submit 不允许自定义绑定提交事件

    我有一个指令 我想用它在提交表单时广播事件 我正在做的项目有很多表单 因此无法在ng submit调用的函数中广播事件 指示 directive form function return restrict E link function s
  • Angular,当任何资源处于待处理状态时显示加载

    我已经编写了一段代码来显示加载器 div 当任何资源处于待处理状态时 无论它是通过 http get 还是路由 ng view 获取的 我不仅仅想要信息 如果我变坏了 流程处理服务 app service flowHandler funct
  • 模板中带有 ng-if 的 angularjs 指令

    我正在构建一个在模板内使用 ng if 的指令 奇怪的是 提供给链接函数的元素没有扩展ng if代码 它只是ng if的注释行 经过一番尝试 我发现通过将链接代码包装在 timeout 中似乎可以使其正常工作 但我想知道这是否不是正确的处理
  • ng-include 和 ng-view 不同时加载

    下面是我的应用程序的结构 很简单 页眉和页脚是非常小的文件 而主页上的 ng view 要大得多 当我进入该页面时 我注意到了这一点 首先加载两个 ng include 然后 ng view 出现 页脚被推到底部 页脚闪烁大约 0 1 秒
  • AngularJS中$scope和scope的区别

    我是 AngularJS 的新手 我想知道有什么区别 scope在 angularjs 控制器中和scope在 angularjs 指令中 我尝试在控制器中使用范围 但出现以下错误 错误 injector unpr 未知提供程序 scope
  • 没有找到 angular.min.js.map,这到底是什么?

    When I load the page and check chrome console i find these errors Angular 中的地图文件到底是什么 我确实引用了 Angular min js 但没有引用 Angula
  • 优雅地处理 AngularJS 错误:$injector:nomod 模块不可用

    我的角度应用程序依赖于第三方角度服务 var app angular module ninjaModule angular google analytics 只要我的广告拦截插件关闭 该应用程序就可以正常加载 然而 随着广告拦截器的角度抛出
  • 嵌套指令 - 无法将参数从 Angularjs 中的子指令传递到控制器方法

    我在 angularjs 中的嵌套指令方面遇到了一些问题 我想从另一个指令中的指令调用控制器方法 并尝试将参数传递给它 但是它们是未定义的 我尝试使用下面的 selected html 中的三个参数来调用remove 在我引入父指令 tel
  • 类型错误:无法读取未定义的属性“defaultPrevented”

    当我进行以下测试时 我收到此错误 it should call pauseAnimationInterval if in focus inject function SearchBoxData intervalManager timeout
  • 如何像在 jQuery 中一样在 AngularJS 中触发事件?

    是否可以做类似的事情 container trigger click 仅使用 AngularJS 如果不可能trigger 还有其他方法来管理这种行为吗 我有一个基本示例 可以在单击按钮时创建一个框 创建的框是可拖动的 现在 用户必须单击按
  • 如何获取 ng-repeat 中的前一项?

    我有一个模板 仅当当前项目与前一个项目有一些不同的字段时 我才想生成一些 HTML 如何访问 ng repeat 中的前一项 你可以做类似的事情 div ul li div class title index content title c
  • 当您只能访问模块变量时注入模块

    假设你有一个 var app angular module Mod1 现在您需要向该模块注入其他内容 但您无法更改该行 您只能访问app多变的 所以这行不通 对吧 var mod2 angular module mod2 factory m
  • ng-model 和值组合不适用于输入文本框

    我有两个输入文本框 我需要组合在两个文本框中输入的值并将其显示在第三个文本框中 如果我只使用value在第三个文本框中 Box 1
  • Restangular - _.contains() 不是一个函数

    如果您最近通过 Bower 更新了 Restangular 它将安装最新的 Lodash 新的 4 0 然而 这是一个问题 因为 Restangular Angular 现在会抛出错误 contains 不是函数 你怎么解决 解决方案非常简
  • 使用谷歌分析处理带有哈希#的网址

    我正在使用 javascript 客户端 mvc 开发一个 js 单页 Web 应用程序 在本例中为 angular js 我在网站上添加了谷歌分析 但从目前我所看到的 至少是实时的 来看 谷歌没有考虑哈希后的 uri 部分 那就是我有一个
  • 使用Nodejs、Express和AngularJS在浏览器中显示IP

    我正在学习 Nodejs 和 ExpressJS 我正在尝试使用 ExpressJS 和 2 个节点模块 请求IP https www npmjs com package request ip and geoip2 https www np
  • Angularjs $http 似乎不理解响应中的“Set-Cookie”

    我有一个带有 Passport 模块的 Nodejs Express REST api 用于身份验证 登录方法 GET 在标头中返回一个 cookie 当我从 Chrome 调用它时 它工作正常 我的 cookie 已在我的浏览器中设置 但
  • Spring Boot 和安全性以及自定义 AngularJS 登录页面

    我正在为 Spring Security 实现一个自定义 AngularJS 登录页面 但遇到身份验证问题 遵循本教程 示例 以及他们的示例在本地运行良好 https github com dsyer spring security ang
  • 角度 $location.path 不起作用

    我有一个类似的问题this one https stackoverflow com questions 11784656 angularjs location not changing the path 但不同 在这里我试图添加一个事件侦听
  • 离子初始加载时间

    我正在使用 Ionic 构建一个简单的应用程序 但我的应用程序在冷启动时的初始加载时间方面存在性能问题 这是我所做的 collection repeat 代替带有 track by 的 ng repeat 原生滚动 overflow scr

随机推荐

  • 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 文档似乎更喜欢工厂而不