告诉AngularJs通过依赖注入返回一个新实例

Łuk*_*man 21 javascript angularjs

用例很简单:我有两个控制器共享相同的依赖项MyService.这项服务是持有一些状态,让我们坐下来myVariable.如果我设置它ControllerOne,那么它也会被发现ControllerTwo.

我想要的是每个控制器拥有它自己的实例MyService,因此myVariable可以由每个控制器更改而不影响另一个.

换句话说 - 我希望通过依赖注入返回新实例,而不是单例.

Ben*_*esh 21

不像你希望的那样直接.服务器实例是在第一次被注射器检索并由注射器维护时创建的......换句话说,它们总是单体.魔术发生在这里,特别是看看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
});
Run Code Online (Sandbox Code Playgroud)

编辑:正如OP指出的那样,还有$ injector.instantiate,您可以使用它来调用控制器之外的JavaScript构造函数.我不确定这里可测试性的含义是什么,但它确实为您提供了另一种方法来注入将为您构造新对象的代码.

  • 还有另一种方式.您可以简单地创建一个具有所需依赖项的对象(组件X),然后直接使用`$ injector.instantiate(ComponentX,{})`注入它.第二个参数可能包含所有`statefull`变量.简单而优雅,谢谢Angular Js!也许您可以将其作为替代解决方案添加到您的回复中,好吗? (4认同)