Service和Factory的区别让您感到困惑?

23 浏览
0 Comments

Service和Factory的区别让您感到困惑?

据我了解,在工厂内部返回一个被注入到控制器中的对象。在服务中使用this处理对象,不返回任何东西。

我一直认为服务总是单例的,而每个控制器都会注入一个新的工厂对象。但事实证明,工厂对象也是单例的?

下面是示例代码:

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是单例的?

我的假设是,工厂会在控制器中注入一个新的实例?

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

对我来说,启示是当我意识到它们都是以相同的方式工作的:通过运行某个东西来存储它们所获得的值,然后在通过依赖注入引用它们时提供这个存储值。\n\n假设我们有:\n\n

app.factory('a', fn);
app.service('b', fn);
app.provider('c', fn);

\n\n三者之间的区别在于:\n\n

    \n

  1. a的存储值来自于运行fn,也就是说:fn()
  2. \n

  3. b的存储值来自于new一个fn,也就是说:new fn()
  4. \n

  5. c的存储值来自于首先通过new一个fn获取一个实例,然后运行该实例的$get方法
  6. \n

\n\n这意味着,Angular 中有一个类似于缓存对象的东西,每个注入的值只在第一次注入时被分配一次,其中:\n\n

cache.a = fn()
cache.b = new fn()
cache.c = (new fn()).$get()

\n\n这就是为什么我们在服务中使用this,并在提供程序中定义this.$get的原因。

0
0 Comments

所有 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 + "!";
    }
  }
});

查看关于 $provide 的演示文稿:http://slides.wesalvaro.com/20121113/#/

这些幻灯片被用于 AngularJs Meetup 之一:http://blog.angularjs.org/2012/11/more-angularjs-meetup-videos.html

0