用例很简单:我有两个 Controller 共享相同的依赖项MyService
。该服务正在保存某种状态,让我们坐一下myVariable
。如果我从 ControllerOne
设置它,那么它也会被 ControllerTwo
发现。
我想要的是每个 Controller 都有自己的 MyService
实例,以便每个 Controller 都可以更改 myVariable
而不会影响另一个 Controller 。
换句话说 - 我希望通过依赖注入(inject)返回新实例,而不是单例。
最佳答案
并不像您希望的那样直接。服务实例是在注入(inject)器第一次检索并由注入(inject)器维护时创建的……换句话说,它们始终是单例。 The magic happens in here ,特别是查看 provider
函数,它将提供程序实例放入providerCache 对象中。
但不要失去希望,如果您选择的话,您可以轻松地为您想要在服务中共享的任何内容添加构造函数:
app.factory('myService', [function() {
var i = 1;
function Foo() {
this.bar = "I'm Foo " + i++;
};
return {
Foo: Foo
};
}]);
app.controller('Ctrl1', function($scope, myService) {
$scope.foo = new myService.Foo();
console.log($scope.foo.bar) //I'm Foo 1
});
app.controller('Ctrl2', function($scope, myService) {
$scope.foo = new myService.Foo();
console.log($scope.foo.bar) //I'm Foo 2
});
编辑:正如OP指出的,还有$injector.instantiate ,您可以使用它来调用 Controller 外部的 JavaScript 构造函数。我不确定这里的可测试性意味着什么,但它确实为您提供了另一种注入(inject)代码的方法,该代码将为您构造一个新对象。
关于javascript - 告诉 AngularJs 通过依赖注入(inject)返回一个新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13604655/