当前位置: 首页 > 知识库问答 >
问题:

对服务与工厂的困惑

苗阳文
2023-03-14
var factories = angular.module('app.factories', []);
var app = angular.module('app',  ['ngResource', 'app.factories']);

factories.factory('User', function () {
  return {
    first: 'John',
    last: 'Doe'
  };
});

app.controller('ACtrl', function($scope, User) {
  $scope.user = User;
});

app.controller('BCtrl', function($scope, User) {
  $scope.user = User;
});

当更改actrl中的user.first时,发现bctrl中的user.first也会更改,例如user是单例?

我的假设是,一个新的实例被注入到带有工厂的控制器中?

共有1个答案

苏涛
2023-03-14

所有angular服务都是单例:

文档(请参见作为单例的服务):https://Docs.angularjs.org/guide/Services

最后,重要的是要认识到所有的Angular服务都是应用程序单例。这意味着每个注入器只有一个给定服务的实例。

基本上,服务和工厂之间的区别如下:

app.service('myService', function() {

  // service is just a constructor function
  // that will be called with 'new'

  this.sayHello = function(name) {
     return "Hi " + name + "!";
  };
});

app.factory('myFactory', function() {

  // factory returns an object
  // you can run some code before

  return {
    sayHello : function(name) {
      return "Hi " + name + "!";
    }
  }
});
 类似资料:
  • 问题内容: 据我了解,当在工厂内部时,我返回一个注入到控制器中的对象。在服务内部时,我使用而不是返回任何东西来处理对象。 我当时以为服务 始终是单例 ,并且每个控制器都注入了一个 新的工厂对象 。但是,事实证明,工厂对象也是单例对象吗? 示例代码演示: 当改变的事实证明,在也发生了变化,比如是一个单身? 我的假设是在工厂的控制器中注入了新实例? 问题答案: 所有角度服务都是单例 : Docs(请参

  • 假设我有一个,它依赖于IResourceManager 使用构造函数注入是解决这种依赖性的正确方法吗 我是否必须在容器中注册我的(及其“派生类型”),以便创建具有已解析依赖项的它们的实例?难道这一切都不复杂吗 在服务定位器周围使用静态工厂是不是很糟糕 撇开单元测试不谈,我真的会因为使用服务定位器反模式而受到惩罚吗 很抱歉一次问很多问题。我已经阅读了以下SO问题和许多其他问题,但阅读它们只会增加我的

  • 问题内容: 我已经看到angular.factory()和angular.service()都用于声明服务;但是,我在官方文档中找不到 任何地方。 两种方法有什么区别? 应该使用哪个(假设他们做不同的事情)? 问题答案: 直到我以这种方式对自己说: 服务 :您编写的 函数 将是 新的 -ed: Factory* :将 调用 您编写的 函数 (构造函数): * 您可以根据自己的意愿进行操作,但是有一

  • 问题内容: 我试图了解Angular中工厂和服务的概念。我在控制器下有以下代码 此代码可以正常工作。但是,当我将$ http服务移入工厂时,我无法将数据返回到控制器。 使用工厂有什么好处,因为$ http即使在控制器下也可以工作 问题答案: 将服务移出控制器的目的是实现关注点分离。服务的工作是知道如何与服务器通信,而控制器的工作是在视图数据和服务器数据之间转换。 但是,您会混淆异步处理程序以及返回

  • 问题内容: 编辑2016年1月: 由于这仍然引起注意。自问了这个之后,我已经完成了一些AngularJS项目,对于我最常使用的那些项目,建立了一个对象并最后返回了该对象。但是,我下面的说法仍然正确。 编辑: 我想我终于了解了两者之间的主要区别,并且我有一个代码示例来演示。我也认为这个问题与建议的重复问题有所不同。重复项说明该服务不可实例化,但是如果您按照我在下面的演示中进行设置,它实际上是可实例化

  • 问题内容: 我是一个有角的新手,正在构建一个应用程序,让我感到困惑的是,有几种方法定义了服务,我从此链接中了解了更多:如何定义服务, 然后似乎没有太大的区别定义服务的方式。 但我只是注意到我认为是不同的一个不同之处: 看到我从这里得到的这项服务http://jsfiddle.net/2by3X/5/ 如果我使用如下所示的“工厂”定义此服务,则一个功能不能调用该服务的其他功能。 我将在浏览器控制台中