AngularJS:从服务创建多个工厂

时间:2015-12-27 20:08:14

标签: angularjs

我想在服务中创建两个独立的实例,如this plunkr

但似乎他们分享了他们的成员。我做错了什么?

angular.module("App", [])
.service("service", function() {
  var $this = this;
  this.number = 1;
  var getNumber = function() { return $this.number; }
  var setNumber = function(n) { $this.number = n; }
  this.build = function() {
    return {
      getNumber: getNumber,
      setNumber: setNumber
    }
  }
}
})

.factory('fac1', function(service) {
  return service.build();
})

.factory('fac2', function(service) {
  return service.build();
})

2 个答案:

答案 0 :(得分:2)

让服务的build函数创建一个新对象并返回新对象。

angular.module("App", [])
  .service("service", function() {
    var number = 0;
    var getNumber = function() { return this.number; }
    var setNumber = function(n) { this.number = n; }
    this.build = function() {
      var newObj = {};
      number += 1;
      newObj.number = number;
      newObj.getNumber = getNumber;
      newObj.setNumber = setNumber;
      return newObj;
    }
  })

如另一个答案所述,工厂提供商和服务提供商都是单身人士。事实上,所有AngularJS提供商都是单身人士。但是单身人士可以作为制造一类物品的“工厂”。

答案 1 :(得分:1)

您似乎对工厂和服务的运作方式感到困惑。

工厂和服务都是单身人士,而且他们都做了基本相同的事情。 More reading here

fac1fac2使用的是service的完全相同的实例,这意味着成员共享实际上是预期的行为。

也许解决问题的方法是在服务中创建一个类,并在构建方法中返回一个新实例。

然后你可以这样做:

angular.module("App", [])
  .service("service", function() {
    var $this = this;

    function myClass() {
      this.number = 1;
    }
    myClass.prototype.getNumber = function() { return $this.number; };
    myClass.prototype.setNumber = function(n) { $this.number = n; }
    this.build = function() {
      return new myClass();
    }
  }
})

如果你不确定javascript中的类是如何工作的,你可以看一下:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript

还有另外一点需要注意。如果你所有的工厂都在做返回你的服务,那么你可能根本不需要你的工厂。只需直接使用您服务的build方法。