我想在服务中创建两个独立的实例,如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();
})
答案 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
fac1
和fac2
使用的是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
方法。